📌 什么是 ScriptableObject
- ScriptableObject 是 Unity 提供的一种轻量级数据容器。
- 它不像
MonoBehaviour那样挂在 GameObject 上,而是以 .asset 文件 的形式存在于项目中。 - 常用于存储配置数据、角色属性、技能参数等。
🛠 创建 ScriptableObject
方法一:使用 CreateAssetMenu 特性
using UnityEngine;[CreateAssetMenu(fileName = "NewEnemyStats", menuName = "Game/Enemy Stats")]
public class EnemyStats : ScriptableObject
{public float health = 100f;public float attack = 10f;
}
- 在 Unity 编辑器中:
Assets → Create → Game → Enemy Stats - 会生成一个
.asset文件,可以在 Inspector 中编辑。
方法二:运行时创建
EnemyStats stats = ScriptableObject.CreateInstance<EnemyStats>();
如果需要保存为 .asset 文件(仅编辑器可用):
#if UNITY_EDITOR
using UnityEditor;EnemyStats stats = ScriptableObject.CreateInstance<EnemyStats>();
AssetDatabase.CreateAsset(stats, "Assets/NewEnemyStats.asset");
AssetDatabase.SaveAssets();
#endif
📦 ScriptableObject 容器
如果需要管理多个数据,可以写一个容器类:
[CreateAssetMenu(fileName = "EnemyStatsContainer", menuName = "Game/Enemy Stats Container")]
public class EnemyStatsContainer : ScriptableObject
{public EnemyStats[] allEnemyStats;
}
这样就能在编辑器里创建一个 EnemyStatsContainer.asset,集中管理多个敌人属性。
🔑 使用场景
- 角色属性:玩家、敌人、NPC 的数值。
- 技能配置:技能伤害、冷却时间、范围。
- 游戏配置:关卡参数、难度设定。
- 数据共享:多个对象共享同一份数据,减少冗余。
⚠️ 注意事项
- ScriptableObject 不依赖场景,可以跨场景复用。
- 不要在运行时直接修改
.asset文件的数据(会影响所有引用),通常在运行时复制一份。 - 适合存储静态数据,不适合存储动态状态。
🎯 总结
- 用
[CreateAssetMenu]在编辑器中快速创建数据资产。 - 用
ScriptableObject.CreateInstance<T>()在运行时创建临时对象。 - 用容器类管理多个 ScriptableObject,方便组织和引用。