kizumi_header_banner_img

Hello! Beautiful Kizumi!

加载中

文章导读

Unity进阶之ScriptableObject


avatar
Yuyas 2025年12月19日 18

ScriptableObject主要作用

  • 配置数据
  • 数据复用(多个物体共享同一个数据,节省内存)

ScriptableObject数据文件的创建

  • 在ScriptableObject的子类上加特性

    • [CreateAssetMenu(fileName = “test1”, menuName = “ScriptableObject/CreateTest”)]

  • 自定义编辑器工具

    • MyData asset = ScriptableObject.CreateInstance<MyData>();
    • AssetDatabase.CreateAsset(asset, “Assets/Resources/MyData.asset”);

ScriptableObject数据文件的生命周期函数

  • Awake 数据文件创建时调用
  • OnDestroy ScriptableObject 对象将被销毁时调用
  • OnDisable ScriptableObject 对象销毁时、即将重新加载脚本程序集时 调用
  • OnEnable ScriptableObject 创建或者加载对象时调用

ScriptableObject配合Json进行数据持久化

  • private void Save()
    {
       string str = JsonUtility.ToJson(data);
       File.WriteAllText(Application.persistentDataPath + “/MusicData.json”, str);
    }

    private void Load()
    {
       if (!File.Exists(Application.persistentDataPath + “/MusicData.json”)) return;
       string str = File.ReadAllText(Application.persistentDataPath + “/MusicData.json”);
       JsonUtility.FromJsonOverwrite(str, data);
    }

  • 反序列化不能直接用FromJson,因为会创建实例,而ScriptableObject对象规定只能通过ScriptableObject.CreateInstance来实例化,故只能使用FromJsonOverwrite进行数据覆写

数据多态

Buff继承ScriptableObject(一般为抽象类,子类重写),Buff又可分为ABuff,BBuff

在对应道具上的字段只要为Buff类即可实现父类装子类,便于配置

单例模式

自定义ScriptableObject子类只要继承这个单例类即可通过Instance获取实例

public class SingleScriptableObject<T> : ScriptableObject where T: ScriptableObject
{
   private static T instance;

   public static T Instance
  {
       get
      {
           //如果为空 首先应该去资源路劲下加载 对应的 数据资源文件
           if (instance == null)
          {
               //我们定两个规则
               //1.所有的 数据资源文件都放在 Resources文件夹下的ScriptableObject中
               //2.需要复用的 唯一的数据资源文件名 我们定一个规则:和类名是一样的
               instance = Resources.Load<T>("ScriptableObject/" + typeof(T).Name);
          }
           //如果没有这个文件 为了安全起见 我们可以在这直接创建一个数据
           if(instance==null)
          {
               instance = CreateInstance<T>();
          }
           //甚至可以在这里 从json当中读取数据,但是我不建议用ScriptableObject来做数据持久化

           return instance;
      }
  }
}



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码

个人信息

avatar

24
文章
1
评论
1
用户

近期文章