Unity 自定义Inspector面板时的数据持久化问题

发布于 2019-08-25  248 次阅读


自定义Inspector面板的步骤:

  1. Unity内创建自定义的Inspector需要在Asset的任意文件夹下创建一个名字是Editor的文件夹,随后这个文件夹内的cs文件就会被放在vstu生成的Editor程序集里。
  2. 自定义Inspector需要创建一个继承自UnityEditor.Editor的类,并且提供一个[CustomEditor(typeof(Behavior))]类特性标记,其中Behaviour就是要自定义观察器的目标组件类型。
  3. 然后在Editor派生类里实现OnInspectorGUI方法,可以使用GUILayout,GUI,EditorGUILayout,EditorGUI的静态方法进行界面绘制。
  4. 如果要在自定义的部分后面显示默认Inspector内容的话,在方法结尾调用一次DrawDefaultInspector();

观察目标的数据持久化问题:

  被观察的目标Prefab上或者场景内对象上挂载的MonoBehavior继承自UnityEngine.Object,支持持久化自身数据,默认会持久化所有public的成员变量。而派生自Editor的自定义Inspector则不适合用来存储数据,因为同一Inspector是可以用来查看不同MonoBehavior实例的。因此需要保存下来的数据,比如自定义Inspector里才显示的文本字段,数组,都应该放进MonoBehaviour,然后定为public访问权限,加上[HideInInspector]标记。

  这里我掉了个坑,在自定义的Inspector里通过target字段来读写MonoBehaviour成员是不会自动持久化的,需要在Editor派生类 (也就是控制自定义Inspector显示的类里)对需要操作的每个成员变量定义一个SerializedProperty类型的属性封装对象。然后用类似以下的方式获取属性实例,这里m_exportPath是被观察MonoBehaviour的字段:

exportPath = serializedObject.FindProperty("m_exportPath");

  serializadObject是Inspector的只读属性,表示target的序列化后数据。在OnInspectorGUI虚方法实现里,第一句最好就是

serializedObject.Update();

  这样是更新target数据到序列化后数据,然后在方法最后调用:

serializedObject.ApplyModifiedProperties();

  如果需要DrawDefaultInspector(); 必须放在 serializedObject.ApplyModifiedProperties(); 之后。

 

参考文章:

Unity Editor 基础篇(二):自定义 Inspector 面板:

https://gameinstitute.qq.com/community/detail/117632



点击数:193


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。