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之前用到的方法。