美文网首页
ScriptableObject

ScriptableObject

作者: tackor | 来源:发表于2018-07-30 13:06 被阅读17次

说明

ScriptableObject用来存储数据的一个资源文件,像是JSON、XML、文本文件这样的存储文件,可以用来存储数据。它也是一个资源文件(.asset)

但相比于Json文件它的优势是,你读取这个文件后可以直接将他赋值给对象,而不需像Json那样需要解析文件(将对应的键值给对应的对象属性).

优点:

  1. 可以作为一个引用在脚本上, 因为他是资源文件(类似预制体.asset)
  2. 不会被Unity序列化机制影响, 所以可以多场景共有
  3. 在实例化对象时用它来做配置文件降低了内存的消耗
  4. 有自己的回调 OnEnable, OnDisable, OnDestroy

使用手册

数据模型:

[serializable]
public class People
{
    public string name;
    public int age;
    
    public People(string name, int age) {
        this.name = name;
        this.age = age;
    }
}

创建

[CreateAssetMenu]  //这样声明可直接在Project中 右键创建
//[CreateAssetMenu(menuName = "Tackor/PeopleDataBase")]
//[MenuItem("Tackor/PeopleDataBase")]  //通过菜单创建
public class PeopleDataBase : ScriptableObject
{
    public List<People> myPeople;
    
    public void PrintPeople()
    {
        for (int i = 0; count = myPeople.Count; i < count; i++) {
            Debug.Log("name: " + myPeople[i].name + "; age: " + myPeople[i].age);
        }
    }
    
    public void Save(string name, int age) {
        myPeople.Add(new People(name, age));
    }
}

CreateAssetMenu 说明:

  • [CreateAssetMenu] //这样声明可直接在Project中 右键创建

  • [CreateAssetMenu(menuName = "TackorAsset/PeopleDataBase")]

  • [CreateAssetMenu(fileName = "PeopleDataBase", menuName = "TackorAsset/PeopleDataBase")]//添加这个特性就能在资源窗口右键创建资源

  • [MenuItem("Tackor/PeopleDataBase")] //通过菜单创建

使用:

var data = Resources.Load<People>("myPeople");
data.Print();

string name = "abc";
int age = 19;
data.Save(name, age);

注意:

脚本文件名称一定要与基础`ScriptableObject的类名一样, 不然会出现脚本为空的情况

15329259858752.png

并导致你之前创建的序列化存储的数据, 在修改了场景或者打包的时候, 数据丢失

15329260649288.png

相关文章

网友评论

      本文标题:ScriptableObject

      本文链接:https://www.haomeiwen.com/subject/hoffvftx.html