自定義檢查員

使用自定義檢查器可以更改在 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 就足夠了,因為我們只想顯示值而不能編輯它們。

結果

之前

StackOverflow 文件

StackOverflow 文件