Unity 自定義Inspector面板時的數據持久化問題


自定義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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM