> 技术文档 > 【Unity通过ScriptableObject配置管理固定数据】解决硬编码等传统数据管理方式的痛点

【Unity通过ScriptableObject配置管理固定数据】解决硬编码等传统数据管理方式的痛点


文章目录

    • 在Unity中使用ScriptableObject管理多个物体的数据
    • 传统数据管理方式的痛点
      • 1. 硬编码在脚本中
      • 2. 外部数据文件(JSON/XML)
    • 使用ScriptableObject
    • 使用方法 创建装备数据模板
      • 1. 定义EquipmentData类
      • 2. 在Unity中创建装备资源
    • 如何使用装备数据
      • 在脚本中引用
    • 总结

在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管理数据可以提高数据修改效率
因为策划可以自己修改数据,及时测试
为啥不说大型项目呢,因为大型项目一般会给策划写工具,涉及到编辑器开发了

其实一些中小型游戏管理比较规范的,也会有可能去写策划工具