在此之前,粗略的介紹下 CustomEditor(自定義編輯)。
Unity對於我們創建的Mono腳本提供了屬性面板的展示和修改。默認情況下,Inspector面板中會顯示當前腳本類的公開字段(public field),這些字段會被序列化並儲存在掛載的預製上。而有些情況下我們需要自定義展示和修改面板數據展示,這時候就用到了Unity提供的CustomEditor。
CustomEditor特性:允許我們自定義當前腳本組件的Inspector檢視面板。
使用方法:
1 public CustomEditor(Type inspectedType); 2 public CustomEditor(Type inspectedType, bool editorForChildClasses);
參數介紹:
inspectedType:指定自定義那個類型的面板數據
editorForChildClasses :是否子類使用同樣的自定義面板,默認不使用
使用示例片段:
//TestData.cs using UnityEngine; /// <summary> /// 測試代碼 /// </summary> public class TestData : MonoBehaviour { [Range(0,1)] public float speed; } //TestDataEditor.cs using UnityEditor; /// <summary> /// 測試代碼,自定義面板數據顯示 /// </summary> [CustomEditor(typeof(TestData))] public class TestDataEditor : Editor { private SerializedProperty _speed; TestData _target; private void OnEnable() { ///方式一 _speed = serializedObject.FindProperty("speed"); ///方式二 //_target = (TestData)target; } public override void OnInspectorGUI() { //將_speed數據修改加入監聽 EditorGUI.BeginChangeCheck(); /// 方式一 serializedObject.Update(); EditorGUILayout.PropertyField(_speed); serializedObject.ApplyModifiedProperties(); ///方式二 //_target.speed = EditorGUILayout.FloatField("速度", _target.speed); //_speed數據修改結束監聽,並在發生修改時,做“髒”標記 if (EditorGUI.EndChangeCheck()) { EditorUtility.SetDirty(target); } } }
在開發過程中,爲了給其他同學提供一些便利,通過自定義顯示面板數據是很常見的一件事。但這會導致我們有時直接獲取的當前組件數據時,發現不是面板上序列化儲存的值。出現這種原因是因爲Editor這邊直接執行了ApplyModifiedProperties,這時候我們可以通過序列化對象獲取想要的數據。
using UnityEngine; using UnityEditor; /// <summary> /// 測試代碼 /// </summary> public class TestData : MonoBehaviour { [Range(0,1)] public float speed; /// <summary> /// 根據使用場景調用方法 /// </summary> private void TestFunc() { //序列化當前對象 SerializedObject obj = new SerializedObject(this); //查找想要的數據 var _speed = obj.FindProperty("speed"); //進行日誌輸出或GUI繪製 Debug.LogError($"原始數據:{speed},序列化後的數據:{_speed}"); } }
總結:我們要想在編輯器這邊獲取CustomEditor(自定義編輯)類的序列化數據時,只需要將當前類對象序列化即可。
資料查找: