说明
ScriptableObject用来存储数据的一个资源文件,像是JSON、XML、文本文件这样的存储文件,可以用来存储数据。它也是一个资源文件(.asset)
但相比于Json文件它的优势是,你读取这个文件后可以直接将他赋值给对象,而不需像Json那样需要解析文件(将对应的键值给对应的对象属性).
优点:
- 可以作为一个引用在脚本上, 因为他是资源文件(类似预制体
.asset
)- 不会被Unity序列化机制影响, 所以可以多场景共有
- 在实例化对象时用它来做配置文件降低了内存的消耗
- 有自己的回调
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
网友评论