有些時候我們會需要一些奇怪的需求,來讓我自定義自己的Inspector面闆,下面我們來做一個基本的自定義面闆的測試demo
首先建立一個
InspectorTest.cs
腳本,我們在裡面定義幾個測試屬性
public float float_Test;
public int int_Test;
public bool bool_Test;
public Color color_Test;
我們将InspectorTest腳本挂載到一個GameObject上,我們檢視一下目前unity預設的Inspector面闆上的屬性序列化出來的樣子:

接下來就是我們自定義自己的面闆序列化樣式了:
先建立一個
InspectorTestEditor.cs
腳本,将這個腳本放置在Editor檔案夾下。
打開腳本,導入
UnityEditor
的命名空間:
using UnityEditor;
讓InspectorTestEditor類繼承Editor類:
public class InspectorTestEditor : Editor{}
在定義類的頭上加上一個标簽:
[CustomEditor(typeof(InspectorTest))]
public class InspectorTestEditor : Editor{}
重寫一下
OnInspectorGUI
方法:
public override void OnInspectorGUI(){}
我們先在方法裡面什麼都不寫,看一下現在InspectorTest腳本的Inspector面闆序列化樣子:
現在裡面什麼都沒有,這是因為我們重寫了面闆的渲染方法,而我們重寫了方法之後裡面什麼都沒有寫,當然什麼都不現實了,
我們先恢複成之前unity原本的序列化樣式,有兩種方式:
1.在
OninspectorGUI
方法裡面調用父類這個方法:
base.OnInspectorGUI();
2.在
OninspectorGUI
方法裡面調用渲染預設Inspector面闆的方法:
DrawDefaultInspector();
兩種方法我們用其中一種就行了,我們看一下現在的面闆顯示:
成功恢複成之前的了,接下來我們不用預設的方法和父類方法實作,來自己實作一下:
InspectorTest inspectorTest = target as InspectorTest;
inspectorTest.float_Test = EditorGUILayout.FloatField("Float測試", inspectorTest.float_Test);
inspectorTest.int_Test = EditorGUILayout.IntField("Int測試", inspectorTest.int_Test);
inspectorTest.bool_Test = EditorGUILayout.Toggle("BoolTest", inspectorTest.bool_Test);
inspectorTest.color_Test = EditorGUILayout.ColorField("顔色測試", inspectorTest.color_Test);
然後我們現在再來看一下inspector面闆裡面的樣式:
顯示完全是按照我們自己定義的名字來顯示的,
除了上述的這種自定義序列化方式外,還有一種渲染方式,我們這裡示範一下,多渲染一個Float_Test屬性:
if (float_Test != null)
{
serializedObject.Update();
EditorGUILayout.PropertyField(float_Test, new GUIContent("Float測試"));
serializedObject.ApplyModifiedProperties();
}
我們看一下現在的渲染面闆的樣式,應該在顔色測試下面又多處一個Float測試的屬性,并且我們更改第一個或者最後一個兩個值都會同步更改一模一樣:
我們還可以在下面加一個按鈕 點一下讓BoolTest屬性變為true,再點一下變為false這樣點一下就變一下的小功能:
if (GUILayout.Button("點選"))
{
inspectorTest.bool_Test = !inspectorTest.bool_Test;
}
然後我們看一下現在的面闆樣式:
然後我們點選 “點選”按鈕就可以看到BoolTest的屬性上的對号出現和消失變換的一個現象。