【问题标题】:Custom Editor Inheritance in UnityUnity 中的自定义编辑器继承
【发布时间】:2019-01-22 20:17:50
【问题描述】:

已解决,修复在代码中

我有一些类想要为其创建自定义编辑器,但我无法让它工作。

我的类相互继承,我希望基类的编辑器将应用于所有子类编辑器

我已经尝试使用[CustomEditor( typeof( BaseClassName ), true )],根据Unity documentation 它应该可以工作。

但是,只有基类有自定义编辑器,子类得到我从它们生成的自定义编辑器,忽略了基类检查器。

我也尝试过从我为基类创建的自定义编辑器类继承,但是没有用……

基类:

[CustomEditor(typeof(ScriptableObjects.CharacterData), true)]
public class CharacterEditor : Editor
{
    private SerializedProperty characterName, characterTexture, characterNormalMap;
    private bool texturesFoldout = false;

    protected void OnEnable()
    {
        characterName = serializedObject.FindProperty("characterName");
        characterTexture = serializedObject.FindProperty("characterTexture");
        characterNormalMap = serializedObject.FindProperty("characterNormalMap");
    }
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        EditorGUILayout.PropertyField(characterName);
        texturesFoldout = EditorGUILayout.Foldout(texturesFoldout, "Textures");
        if (texturesFoldout)
        {
            EditorGUILayout.PropertyField(characterTexture);
            EditorGUILayout.PropertyField(characterNormalMap);
        }
        serializedObject.ApplyModifiedProperties();
    }
}

子类:

[CustomEditor(typeof(ScriptableObjects.SoldierData))]
public class SoldierEditor : CharacterEditor
{
    private SerializedProperty life, autoAttack, skills;

    protected new void OnEnable()
    {
        base.OnEnable();
        life = serializedObject.FindProperty("life");
        autoAttack = serializedObject.FindProperty("autoAttack");
        skills = serializedObject.FindProperty("skills");
    }
    public override void OnInspectorGUI()
    {
        // base.DrawDefaultInspector(); The mistake
        base.OnInspectorGUI(); // The FIX!
        serializedObject.Update();
        EditorGUILayout.PropertyField(life);
        EditorGUILayout.PropertyField(autoAttack);
        EditorGUILayout.PropertyField(skills);
        serializedObject.ApplyModifiedProperties();
    }
}

图片:

如您所见,纹理折叠仅在基类中

【问题讨论】:

    标签: c# unity3d inheritance editor


    【解决方案1】:

    当您覆盖字符编辑器时,您永远不会调用基本方法。您需要添加 base.OnEnable();到士兵编辑器的 OnEnable 方法和 base.OnInspectorGUI();到士兵编辑器的 OnInspectorGUI 方法,以便他们利用基类的功能。

    此外,作为命名约定的注释,任何从编辑器派生的东西都应该称为编辑器。因此,为了清楚起见,这些类应称为 CharacterEditor 和 SoldierEditor。

    【讨论】:

    • @Louis_Ingenthron 我已经尝试了你的建议,但得到了相同的结果......有什么想法吗?
    • 根据你的编辑,你做了 base.DrawDefaultInspector 而不是 base.OnInspectorGUI
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多