【Unity】ScriptableObject

发布于 2021-08-31


简介

ScriptableObject是用来存储数据的一个资源文件,像是JSON、XML、文本文件这样的存储文件,可以用来存储数据。但是这里他在最开始的时候不需要再读文件,就想是JSON在游戏开始时,我们需要加载JSON文件中的数据,我们就需要读取这个文件,然后在赋值给对象。他就可以直接使用其中的数据。因为他是资源文件,所以他有着资源文件的特性,我们Resource.Load他就可以使用他了。

其实可以简单的理解为把你所有的数据都用变量在一个类中声明,然后我们使用的时候,直接实例化这个类就好了。

优势

  • 不会被unity序列化机制影响,故可以多场景共用。
  • 可以作为一个引用在脚本上,因为它是资源文件
  • 在实例化对象时用它来做配置文件降低了内存的消耗
  • 有自己的回调OnEnable、OnDisable、OnDestroy

解决了什么问题

  • ScriptableObject的数据存储在asset里面,退出时不会重置数据,就像unity里的材质,纹理等资源数据一样
  • 这些资源在实例化的时候是可以被引用,而不是复制
  • 可以在场景间共享
  • 在项目之间共享

用法

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class MyObj
{
    public int age;
    public string name;
}
[CreateAssetMenu]
public class MySciptObj : ScriptableObject
{
    public List<MyObj> myObjs;

    public void Print()
    {
        for(int i=0,iMax=myObjs.Count;i<iMax;i++)
        {
            Debug.Log("Name:"+myObjs[i].name+"Age:"+myObjs[i].age);
        }
    }
    public void Save(string name,int age)
    {
        myObjs.Add(new MyObj { name=name,age=age});
    }
}