天天看點

【編輯器擴充】實作自定義腳本Inspector面闆顯示

有些時候我們會需要一些奇怪的需求,來讓我自定義自己的Inspector面闆,下面我們來做一個基本的自定義面闆的測試demo

首先建立一個

InspectorTest.cs

腳本,我們在裡面定義幾個測試屬性

public float float_Test;
public int int_Test;
public bool bool_Test;
public Color color_Test;
           

我們将InspectorTest腳本挂載到一個GameObject上,我們檢視一下目前unity預設的Inspector面闆上的屬性序列化出來的樣子:

【編輯器擴充】實作自定義腳本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面闆序列化樣子:

【編輯器擴充】實作自定義腳本Inspector面闆顯示

現在裡面什麼都沒有,這是因為我們重寫了面闆的渲染方法,而我們重寫了方法之後裡面什麼都沒有寫,當然什麼都不現實了,

我們先恢複成之前unity原本的序列化樣式,有兩種方式:

1.在

OninspectorGUI

方法裡面調用父類這個方法:

base.OnInspectorGUI();
           

2.在

OninspectorGUI

方法裡面調用渲染預設Inspector面闆的方法:

DrawDefaultInspector();
           

兩種方法我們用其中一種就行了,我們看一下現在的面闆顯示:

【編輯器擴充】實作自定義腳本Inspector面闆顯示

成功恢複成之前的了,接下來我們不用預設的方法和父類方法實作,來自己實作一下:

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面闆裡面的樣式:

【編輯器擴充】實作自定義腳本Inspector面闆顯示

顯示完全是按照我們自己定義的名字來顯示的,

除了上述的這種自定義序列化方式外,還有一種渲染方式,我們這裡示範一下,多渲染一個Float_Test屬性:

if (float_Test != null)
            {
                serializedObject.Update();
                EditorGUILayout.PropertyField(float_Test, new GUIContent("Float測試"));
                serializedObject.ApplyModifiedProperties();
            }
           

我們看一下現在的渲染面闆的樣式,應該在顔色測試下面又多處一個Float測試的屬性,并且我們更改第一個或者最後一個兩個值都會同步更改一模一樣:

【編輯器擴充】實作自定義腳本Inspector面闆顯示

我們還可以在下面加一個按鈕 點一下讓BoolTest屬性變為true,再點一下變為false這樣點一下就變一下的小功能:

if (GUILayout.Button("點選"))
        {
            inspectorTest.bool_Test = !inspectorTest.bool_Test;          
        }
           

然後我們看一下現在的面闆樣式:

【編輯器擴充】實作自定義腳本Inspector面闆顯示

然後我們點選 “點選”按鈕就可以看到BoolTest的屬性上的對号出現和消失變換的一個現象。