ScriptableObject主要實現對象序列化的保存。
打包為資源后如下圖:
圖1
在u3d編輯器里,還可以手動修改數據,這個功能很直觀,可以當一個可視化的配置文件管理。
可視化編輯如下圖:
圖2
首先有一個繼承自ScriptableObject的類:
using UnityEngine; using System.Collections.Generic; [System.Serializable] public class Test_ScriptObject : ScriptableObject { public List<Vector4> m_szPoints = new List<Vector4>(); }
下面看如何創建asset資源:
[ContextMenu("CreatetScriptable")] void CreateTestScriptable() { DirectoryInfo info = new DirectoryInfo("Assets/Resources/CineAsset"); if (!info.Exists) { info.Create(); } string sFullName = Path.Combine("Assets/Resources/CineAsset", "PlaneCine.asset"); Test_ScriptObject test_ScriptObject = ScriptableObject.CreateInstance<Test_ScriptObject>(); test_ScriptObject.m_szPoints.Add(Vector4.zero); test_ScriptObject.m_szPoints.Add(Vector4.one); AssetDatabase.CreateAsset(test_ScriptObject, sFullName); }
//不是完整的類,需要using IO和UnityEditor包
這個功能主要是創建了一個Test_ScriptObject的實例化文件。打包完成后就如圖1所示。
下面看如何加載使用:
[ContextMenu("LoadAndUpdateScriptable")] void LoadAndUpdateScriptable() { Object oo = Resources.Load("CineAsset/PlaneCine"); Test_ScriptObject test_ScriptObject = ScriptableObject.Instantiate(oo) as Test_ScriptObject; Debug.LogFormat("aaaaaaaaaaaaaa___{0}", test_ScriptObject.m_szPoints.Count); test_ScriptObject.m_szPoints.Clear(); Debug.LogFormat("bbbbbbbbbbbbbb___{0}", test_ScriptObject.m_szPoints.Count); }
這是簡單從本地Resources加載的用例,當然也可以AssetBundle下載使用。
注意:加載出來是一個實力,可以復制很多份,就像材質一樣,所以在這里修改數據不會保存到PlaneCine.asset文件里。
至於如何修改PlaneCine.asset內的數據,我知道至少兩種方式:
1,直接在編輯器修改數據保存---圖2所示。
2.通過SerializedObject和SerializedProperty修改---具體的代碼會下載另外一篇里,這也是寫ScriptableObject之前用到的方法。
