ScriptableObject

weixin_33912445發表於2018-07-30

說明

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的類名一樣, 不然會出現指令碼為空的情況

1476913-fd80846b4bf674bb.png
15329259858752.png

並導致你之前建立的序列化儲存的資料, 在修改了場景或者打包的時候, 資料丟失

1476913-2685ca3594037dc4.png
15329260649288.png