ScriptableObject
說明
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的類名一樣, 不然會出現指令碼為空的情況
並導致你之前建立的序列化儲存的資料, 在修改了場景或者打包的時候, 資料丟失