自定義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 面板: