Appearance
ScriptableObject
一句话理解
ScriptableObject 是 Unity 里的共享数据资产。
它不是挂在 GameObject 上的组件,而是 Project 面板里的 .asset 文件。
c
MonoBehaviour:挂在场景物体上,负责行为
ScriptableObject:存在 Project 里,负责数据适合放什么
c
物品配置:id、名字、图标、描述
武器配置:伤害、射程、冷却、子弹 Prefab
敌人配置:血量、速度、掉落表
技能配置:消耗、伤害、特效、冷却
关卡配置:目标、刷怪点、奖励
音频配置:按钮音、攻击音、环境音集合最小例子:武器配置
c
using UnityEngine;
[CreateAssetMenu(fileName = "WeaponData", menuName = "Game Data/Weapon")]
public class WeaponData : ScriptableObject
{
public string id;
public string displayName;
public int damage;
public float range;
public float cooldown;
public Sprite icon;
}创建方式:
c
Project 面板右键
Create > Game Data > Weapon然后你会得到一个 .asset 文件,比如:
c
Sword.asset
Bow.asset
FireStaff.asset怎么使用
c
using UnityEngine;
public class WeaponUser : MonoBehaviour
{
public WeaponData weapon;
public void Attack()
{
Debug.Log($"使用 {weapon.displayName},造成 {weapon.damage} 点伤害");
}
}把 Sword.asset 拖到 weapon 字段里即可。
为什么不用 MonoBehaviour 直接存
假设有 100 个敌人都用同一套配置。
不用 ScriptableObject:
c
每个敌人 Prefab / 实例里都复制一份血量、速度、掉落数据用 ScriptableObject:
c
100 个敌人都引用 EnemyConfig.asset好处:
c
统一修改
减少重复数据
项目结构更清楚
策划/设计可以在 Inspector 改配置
Prefab 不用塞一堆固定参数官方文档也提到:ScriptableObject 常用作共享数据容器,可以避免多个对象重复保存同一份值。
和存档的关系
重点来了:ScriptableObject 适合存“配置”,不适合直接当“玩家存档”。
例如物品:
c
Potion.asset
id = potion_small
name = Small Potion
healAmount = 30
icon = ...玩家存档里只保存:
c
{
"itemId": "potion_small",
"count": 3
}加载时:
c
itemId -> 找到 Potion.asset -> 得到名字、图标、回血量
count -> 玩家拥有数量也就是说:
c
ScriptableObject:定义这是什么东西
JSON 存档:记录玩家拥有多少、当前状态如何常见坑
c
以为 ScriptableObject 可以挂到 GameObject 上
运行时修改共享资产,导致所有引用者一起变
把玩家当前血量、当前位置直接存在 ScriptableObject 里
没有给数据资产稳定 id,后面存档难恢复
类名和文件名不一致
把 ScriptableObject 当成数据库或完整存档系统你该怎么用它
新手推荐先做三个:
c
ItemData
WeaponData
EnemyData再配合 JSON:
c
ScriptableObject 存配置
JSON 存玩家进度记住口诀:
c
ScriptableObject 是共享配置资产。
MonoBehaviour 是场景行为组件。
Prefab 是可复用物体模板。
JSON 是玩家存档文本。
存档里存 ID 和变化值,不存资产本体。参考:Unity 官方 ScriptableObject Manual、ScriptableObject API、CreateAssetMenu。