自定义检查员

使用自定义检查器可以更改在 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 文档