Skip to content

ScriptableObject

unity-scriptableobject-deep-dive

一句话理解

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 ManualScriptableObject APICreateAssetMenu

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0