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