当前位置:   article > 正文

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

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

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

  1. 在游戏开发中,经常会用到一些配置文件保存一些数据,然后项目运行中读取这些配置文件中的数据在游戏中使用。
  2. 如:配置血条:根据角色类型(人物、动物、怪物等)配置不同的血条,包括血条大小,血条名或血条预设,血条颜色等一些简单数据。
  3. 如:配置子弹:子弹类型(真子弹、假子弹、追踪子弹等),子弹速度,伤害数值,子弹关联的特效等。
  4. 诸如此类的配置很多种,可创建一个可序列化的类存储数据,或者创建 XML 、JSON 文件保存数据,创建 Excel 文件,创建 TXT 文件,皆可完成需求,灵活使用这些方法保存配置数据。
  5. 在此介绍一下使用可序列化类保存配置,并且将可序列化类保存成Unity的自定义文件(.asset),然后配置自定义文件(.asset)。
  6. 优点:
  7. 可以保存数据类型多样(intstring、Vector3、GameObject、Transform、Texture等)如关联预设,关联图片等资源数据,而XML、TXT等只能保存(intstring、Vector3 等基本数据类型)。
  8. 缺点:
  9. 如果配置数据中保存了(GameObject、Texture)等资源数据,当关联的资源被删除时,配置数据将丢失,需要重新将新的资源再次关联到配置数据上。
  10. 下面做个简单的子弹配置数据
  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. }

 

 

  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 在指定路径生成自定义资源

查看生成资源如下

这里写图片描述

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

修改如下

  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面板, 代码如下

  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面板结束

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/125092
推荐阅读
相关标签
  

闽ICP备14008679号