【Unity通过ScriptableObject配置管理固定数据】解决硬编码等传统数据管理方式的痛点
文章目录
在Unity中使用ScriptableObject管理多个物体的数据
在游戏开发中,我们经常需要处理大量固定配置数据,比如装备属性、技能参数、关卡信息等。这些数据通常需要满足:
- 独立于游戏逻辑代码
- 方便非程序员修改(策划)
- 支持运行时读取
- 易于批量管理
传统数据管理方式的痛点
1. 硬编码在脚本中
// 硬编码示例public class EquipmentManager : MonoBehaviour{ public List<Equipment> allEquipments = new List<Equipment>() { new Equipment(1, \"木剑\", \"新手使用的木剑\"), new Equipment(2, \"铁盾\", \"新手使用的铁盾\"), };}
弊端:
- 每次修改数据都需要重新编译项目
- 数据与代码高度耦合
- 无法实现可视化编辑
2. 外部数据文件(JSON/XML)
// equipment.json[ { \"id\": 1, \"name\": \"木剑\", \"description\": \"新手使用的木剑\" }, // ...]
弊端:
- 需要手动处理文件加载/解析(序列化)
- 编辑器内无法实时预览
- 容易因格式错误导致解析失败
- 数据添加不易TUT
使用ScriptableObject
ScriptableObject 是Unity提供的专门用于存储数据的基类,完美解决上述痛点:
- 数据与代码分离
- 可视化编辑界面
- 无需运行时解析
- 支持资源引用
使用方法 创建装备数据模板
1. 定义EquipmentData类
// EquipmentData.csusing UnityEngine;[CreateAssetMenu(fileName = \"NewEquipment\", menuName = \"Inventory/Equipment Data\")]public class EquipmentData : ScriptableObject{ [Header(\"基础信息\")] public int id; // 装备唯一ID 方便记忆也可使用string public string itemName; // 装备名称 [TextArea] public string description; // 装备描述 [Header(\"战斗属性\")] public int attackPower; // 攻击力加成 public int defense; // 防御力加成 public float critChance; // 暴击率 [Header(\"图标\")] public Sprite icon; // 装备图标 public GameObject prefab;// 3D模型}
为什么描述标记了
[TextArea]
(文本域)
因为不标记在窗口配置时使用例如\"\\n\"
是无法被成功转义的
当有多个需要配置的装备时需要改变一下数据结构
using System;using System.Collections.Generic;using UnityEngine;[CreateAssetMenu(fileName = \"NewEquipment\", menuName = \"Inventory/Equipment Data\")]public class EquipmentData : ScriptableObject{ [SerializeField] public List<Equipment> equipMents;}[Serializable]public class Equipment{ [Header(\"基础信息\")] public int id; // 装备唯一ID 方便记忆也可使用string public string itemName; // 装备名称 [TextArea] public string description; // 装备描述 [Header(\"战斗属性\")] public int attackPower; // 攻击力加成 public int defense; // 防御力加成 public float critChance; // 暴击率 [Header(\"图标\")] public Sprite icon; // 装备图标 public GameObject prefab;// 3D模型}
将我们装备包装成一个类,放到列表中,注意继承关系
注意:装备类必须标记为[Serializable]
意思是可序列化,如果没有这个标记无法在窗口看见
2. 在Unity中创建装备资源
[CreateAssetMenu(fileName = \"NewEquipment\", menuName = \"Inventory/Equipment Data\",order =0)]
fileName是创建时的默认名字
menuName是在unity中右键时在选项中的名字(路径)
order =0代表它在这个选项中的排序(0开始向下排序)
然后我们就可以在Unity创建它啦
创建完成后就会出现一个小东西,单击它就可以配置数据了
点击+号配置你的装备吧!
如何使用装备数据
在脚本中引用
public class PlayerInventory : MonoBehaviour{ // 通过Inspector拖拽赋值 public EquipmentData weapons; private void Start() { Test(0);//传入id打印测试 } void Test(int id) { Debug.log($\"武器id{weapons[id].id}\"); Debug.log($\"武器名字{weapons[id].itemName}\"); //....这里不多写了哦 }}
如上就可以拿到我们配置好的数据了
如果不想拖拽引用也可以使用Resources
加载为EquipmentData类也是一样的
注意路径不要错哦
总结
在中小型项目中,使用ScriptableObject管理数据可以提高数据修改效率
因为策划可以自己修改数据,及时测试
为啥不说大型项目呢,因为大型项目一般会给策划写工具,涉及到编辑器开发了
其实一些中小型游戏管理比较规范的,也会有可能去写策划工具