本文原创版权归 强哥的私房菜 所有,此处为转载,如有再转,请于篇首位置标明原创作者及出处,以示尊重!

作者:强哥的私房菜

原文:http://blog.csdn.net/liqiangeastsun/article/details/50510615

在游戏开发中,经常会用到一些配置文件保存一些数据,然后项目运行中读取这些配置文件中的数据在游戏中使用。

如:配置血条:根据角色类型(人物、动物、怪物等)配置不同的血条,包括血条大小,血条名或血条预设,血条颜色等一些简单数据。

如:配置子弹:子弹类型(真子弹、假子弹、追踪子弹等),子弹速度,伤害数值,子弹关联的特效等。

诸如此类的配置很多种,可创建一个可序列化的类存储数据,或者创建 XML 、JSON 文件保存数据,创建 Excel 文件,创建 TXT 文件,皆可完成需求,灵活使用这些方法保存配置数据。

在此介绍一下使用可序列化类保存配置,并且将可序列化类保存成Unity的自定义文件(.asset),然后配置自定义文件(.asset)。

优点:
可以保存数据类型多样(int、string、Vector3、GameObject、Transform、Texture等)如关联预设,关联图片等资源数据,而XML、TXT等只能保存(int、string、Vector3 等基本数据类型)。

缺点:
如果配置数据中保存了(GameObject、Texture)等资源数据,当关联的资源被删除时,配置数据将丢失,需要重新将新的资源再次关联到配置数据上。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面做个简单的子弹配置数据:

[csharp] view plaincopy
  1. // 创建一个可序列化的子弹类 Bullet.CS
  2. using UnityEngine;
  3. using System.Collections;
  4. using System;
  5. // 子弹类型枚举
  6. public enum BulletType
  7. {
  8. DirectAttack = 0,  // 直接攻击
  9. Phony,             // 假子弹
  10. Real,              // 真子弹
  11. Track,             // 追踪子弹
  12. }
  13. /// <summary>
  14. /// 可序列化
  15. /// </summary>
  16. [Serializable]
  17. public class Bullet : ScriptableObject {
  18. // Bullet 类直接继承自 ScriptableObject
  19. // 子弹类型
  20. public BulletType bulletType = BulletType.DirectAttack;
  21. // 子弹速度
  22. public int speed = 10;
  23. // 伤害数值
  24. public int damage = 5;
  25. // 子弹关联的特效
  26. public GameObject effectObj;
  27. }

创建一个编辑器类,在 菜单栏添加功能按钮,生成自定义资源:

[csharp] view plaincopy
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. using System.IO;
  5. public class CreateAsset : Editor {
  6. // 在菜单栏创建功能项
  7. [MenuItem("CreateAsset/Asset")]
  8. static void Create()
  9. {
  10. // 实例化类  Bullet
  11. ScriptableObject bullet = ScriptableObject.CreateInstance<Bullet>();
  12. // 如果实例化 Bullet 类为空,返回
  13. if (!bullet)
  14. {
  15. Debug.LogWarning("Bullet not found");
  16. return;
  17. }
  18. // 自定义资源保存路径
  19. string path = Application.dataPath + "/BulletAeeet";
  20. // 如果项目总不包含该路径,创建一个
  21. if (!Directory.Exists(path))
  22. {
  23. Directory.CreateDirectory(path);
  24. }
  25. //将类名 Bullet 转换为字符串
  26. //拼接保存自定义资源(.asset) 路径
  27. path = string.Format("Assets/BulletAeeet/{0}.asset", (typeof(Bullet).ToString()));
  28. // 生成自定义资源到指定路径
  29. AssetDatabase.CreateAsset(bullet, path);
  30. }
  31. }

如下:

点击 Asset 在指定路径生成自定义资源

查看生成资源如下:

为了省事,下面直接在编辑器类中加一个方法,读取自定义文件

修改如下:

[csharp] view plaincopy
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. using System.IO;
  5. using System;
  6. public class CreateAsset : Editor {
  7. [MenuItem("CreateAsset/Asset")]
  8. static void Create()
  9. {
  10. // 实例化类  Bullet
  11. ScriptableObject bullet = ScriptableObject.CreateInstance<Bullet>();
  12. // 如果实例化 Bullet 类为空,返回
  13. if (!bullet)
  14. {
  15. Debug.LogWarning("Bullet not found");
  16. return;
  17. }
  18. // 自定义资源保存路径
  19. string path = Application.dataPath + "/BulletAeeet";
  20. // 如果项目总不包含该路径,创建一个
  21. if (!Directory.Exists(path))
  22. {
  23. Directory.CreateDirectory(path);
  24. }
  25. //将类名 Bullet 转换为字符串
  26. //拼接保存自定义资源(.asset) 路径
  27. path = string.Format("Assets/BulletAeeet/{0}.asset", (typeof(Bullet).ToString()));
  28. // 生成自定义资源到指定路径
  29. AssetDatabase.CreateAsset(bullet, path);
  30. }
  31. [MenuItem("CreateAsset/GetAsset")]
  32. static void GetAsset()
  33. {
  34. //读取 .asset 文件, 直接转换为 类  Bullet
  35. Bullet bullet = AssetDatabase.LoadAssetAtPath<Bullet>("Assets/BulletAeeet/Bullet.asset");
  36. // 打印保存的数据
  37. Debug.Log("BulletType  :" + Enum.GetName(typeof(BulletType), bullet.bulletType));
  38. Debug.Log("Speed       :" + bullet.speed);
  39. Debug.Log("damage      :" + bullet.damage);
  40. if (bullet.effectObj)
  41. {
  42. Debug.Log("EffectObj   :" + bullet.effectObj.name);
  43. }
  44. }
  45. }

打印结果如下:

如果想自定义 文件的 Inspector面板,使用编辑器类重写 Bullet.cs 的Inspector面板, 代码如下:

[csharp] view plaincopy
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. [CustomEditor(typeof(Bullet))]
  5. public class BulletInspector : Editor {
  6. // 子弹类型
  7. public SerializedProperty bulletType;
  8. // 子弹速度
  9. public SerializedProperty speed;
  10. // 伤害数值
  11. public SerializedProperty damage;
  12. // 子弹关联的特效
  13. public SerializedProperty effectObj;
  14. private void OnEnable()
  15. {
  16. bulletType = serializedObject.FindProperty("bulletType");
  17. speed = serializedObject.FindProperty("speed");
  18. damage = serializedObject.FindProperty("damage");
  19. effectObj = serializedObject.FindProperty("effectObj");
  20. }
  21. public override void OnInspectorGUI()
  22. {
  23. serializedObject.Update();
  24. EditorGUI.indentLevel = 1;
  25. EditorGUILayout.PropertyField(bulletType, new GUIContent("子弹类型"));
  26. GUILayout.Space(5);
  27. EditorGUILayout.PropertyField(speed, new GUIContent("子弹速度"));
  28. GUILayout.Space(5);
  29. EditorGUILayout.PropertyField(damage, new GUIContent("伤害数值"));
  30. GUILayout.Space(5);
  31. EditorGUILayout.PropertyField(effectObj, new GUIContent("特效对象"));
  32. GUILayout.Space(10);
  33. // 打印数据
  34. if (GUILayout.Button("Debug"))
  35. {
  36. Debug.Log("bulletType    :" + (BulletType)bulletType.enumValueIndex);
  37. Debug.Log("speed         :" + speed.intValue);
  38. Debug.Log("damage        :" + damage.intValue);
  39. if (effectObj.objectReferenceValue)
  40. {
  41. Debug.Log("effectObj    :" + effectObj.objectReferenceValue);
  42. }
  43. }
  44. if (GUI.changed)
  45. {
  46. EditorUtility.SetDirty(target);
  47. }
  48. serializedObject.ApplyModifiedProperties();
  49. }
  50. }

再看效果,自定义的:

到此将序列化类生成自定义文件 (.asset)成功,读取成功,重写Inspector面板结束。

Unity使用自定义资源(.asset)配置数据相关推荐

  1. unity 引用prefab_十九:Unity 配置数据(序列化)的重构

    今天看到 @Funny David 的文章从Odin插件聊基于元数据的编辑器实现,这篇文章非常好. 最后评论部分有朋友提到一个配置的麻烦点,故有感而发,说一点我的思路和处理方法: 当我们在使用unit ...

  2. 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )

    文章目录 一.开启资源压缩 二.启用严格模式的资源引用检查 三.自定义保留/移除资源配置 四.资源压缩效果 五.完整配置 1.keep.xml 配置 2.build.gradle 构建脚本 六.参考资 ...

  3. 数据科学 IPython 笔记本 8.14 自定义 Matplotlib:配置和样式表

    8.14 自定义 Matplotlib:配置和样式表 原文:Customizing Matplotlib: Configurations and Stylesheets 译者:飞龙 协议:CC BY- ...

  4. Unity3D自定义资源配置文件

    http://blog.csdn.net/candycat1992/article/details/52181814 写在前面 我竟然最近两天才知道Unity中ScriptableObject的存在- ...

  5. Unity游戏运行资源的制作与下载

    我们的游戏制作完发布出去提供给玩家,为了给玩家带来更好的游戏体验,要做各种的优化以及设计,首先,游戏资源的加载就是一个非常重要的方面(尤其是网页游戏).由于我们的游戏资源比较大,不能一下全部加载出来, ...

  6. azure 配置vpn_ASP.NET和Azure中配置中的私有配置数据和连接字符串的最佳做法

    azure 配置vpn A reader emailed asking how to avoid accidentally checking in passwords and other sensit ...

  7. Unity 3D 导入资源包 || Unity 3D 导出资源包

    项目中的一些资源具有复用性,只需要将资源导出,就能够重复使用. 导出资源包 执行 Assets → Select Dependencies 菜单命令,选中与导出资源相关的内容.接着执行 Assets→ ...

  8. Multipart自定义资源限制文件大小限制设计——aop切面怎么才能切入Multipart的文件大小拦截?

    Multipart自定义资源限制文件大小限制设计--aop切面怎么才能切入Multipart的文件大小拦截? author:陈镇坤27 创建时间:2022年1月23日 创作不易,转载请注明来源 摘要: ...

  9. aws cloudformation 理解自定义资源的使用

    资料 AWS::CloudFormation::CustomResource cfn-response module 自定义资源的逻辑 cloudformation只能对aws service进行部署 ...

最新文章

  1. 嵌入式Linux入门经典笔记
  2. 咱们来聊聊快速失败和安全失败
  3. linux卸载桌面Ubuntu,Ubuntu安装卸载KDE桌面之折腾记
  4. winform下的未捕捉的异常处理
  5. 12c RMAN新特性之Recover Table
  6. python爬取小说项目概述_Python实战项目网络爬虫 之 爬取小说吧小说正文
  7. js php 中文乱码怎么解决_php中文乱码怎么解决
  8. Django:django.db.utils.OperationalError: (1050, “Table ‘malicious_software_db‘ already exists“)
  9. [2018.07.12 T2] B君的第二题
  10. 使用mybatis生成UUID
  11. Excel如何快速提取红色字体文本
  12. 粒子群算法(PSO)光伏发电 MPPT实现多峰值寻优,阴影遮蔽光伏发电算法 使用s函数编写粒子群算法,阴影遮蔽,实现多峰值寻优
  13. 超详细的程序员未来职业发展路线
  14. Windows图标-Icon文件格式分析
  15. Unity跑酷游戏的无尽关卡是如何生成的?
  16. Android Studio Build Output控制台输出乱码解决
  17. CCleaner 4.07中文版下载 绿色精简
  18. ARMv7-M4处理器系列文章-2 编程模型
  19. GPS模块——基于Arduino
  20. 私服服务器显示关闭怎么办,《魔兽世界》私服关闭

热门文章

  1. mob sdk vue 短信验证_如何快速集成短信验证码API[图文教程]
  2. 直接学python3_新手应该学python2还是python3?
  3. sql2012找不到到服务器,SQL Server无法连接到服务器怎么办
  4. 浙大计算机基础知识2,[精选资料]14年浙大远程计算机基础2Windows知识题高起专 作业题2答案...
  5. 利用函数求两个数的最大值
  6. wangeditor中添加超链接校验
  7. CSS清除浏览器input缓存黄色背景
  8. mysql之查询前几条或者中间某几行数据
  9. mysql之多表联合查询并输入数据来自哪张表
  10. 32 开漏输出 高电平_关于各种IO输出类型详解