自定義檢查員
使用自定義檢查器可以更改在 Inspector 中繪製指令碼的方式。有時,你希望在檢查器中為指令碼新增額外資訊,這些資訊無法與自定義屬性抽屜一起使用。
下面是一個自定義物件的簡單示例,使用自定義檢查器可以顯示更多有用資訊。
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class InspectorExample : MonoBehaviour {
public int Level;
public float BaseDamage;
public float DamageBonus {
get {
return Level / 100f * 50;
}
}
public float ActualDamage {
get {
return BaseDamage + DamageBonus;
}
}
}
#if UNITY_EDITOR
[CustomEditor( typeof( InspectorExample ) )]
public class CustomInspector : Editor {
public override void OnInspectorGUI() {
base.OnInspectorGUI();
var ie = (InspectorExample)target;
EditorGUILayout.LabelField( "Damage Bonus", ie.DamageBonus.ToString() );
EditorGUILayout.LabelField( "Actual Damage", ie.ActualDamage.ToString() );
}
}
#endif
首先,我們使用一些欄位定義自定義行為
public class InspectorExample : MonoBehaviour {
public int Level;
public float BaseDamage;
}
在檢查器視窗中檢視指令碼時,將自動繪製上面顯示的欄位(無需自定義檢查器)。
public float DamageBonus {
get {
return Level / 100f * 50;
}
}
public float ActualDamage {
get {
return BaseDamage + DamageBonus;
}
}
Unity 不會自動繪製這些屬性。要在 Inspector 檢視中顯示這些屬性,我們必須使用自定義檢查器。
我們首先要定義這樣的自定義檢查器
[CustomEditor( typeof( InspectorExample ) )]
public class CustomInspector : Editor {
自定義檢查器必須從編輯器派生並需要 CustomEditor 屬性。屬性的引數是此自定義檢查器應用於的物件的型別。
接下來是 OnInspectorGUI 方法。只要在檢查器視窗中顯示指令碼,就會呼叫此方法。
public override void OnInspectorGUI() {
base.OnInspectorGUI();
}
我們呼叫 base.OnInspectorGUI()
讓 Unity 處理指令碼中的其他欄位。如果我們不呼叫我們,我們就必須自己做更多工作。
接下來是我們要顯示的自定義屬性
var ie = (InspectorExample)target;
EditorGUILayout.LabelField( "Damage Bonus", ie.DamageBonus.ToString() );
EditorGUILayout.LabelField( "Actual Damage", ie.ActualDamage.ToString() );
我們必須建立一個臨時變數,它將目標儲存到我們的自定義型別(目標可用,因為我們從編輯器派生)。
接下來我們可以決定如何繪製我們的屬性,在這種情況下,兩個 labelfield 就足夠了,因為我們只想顯示值而不能編輯它們。
結果
之前
後