Unity中的自定义编辑器继承

时间:2019-01-22 20:17:51

标签: c# unity3d inheritance editor

已解决,此修复已在代码中

我有一些要为其创建自定义编辑器的类,但是我无法使其正常工作。

我的类彼此继承,我希望基类的编辑器可以应用于所有子类编辑器

根据Unity documentation的假设,我尝试使用[CustomEditor( typeof( BaseClassName ), true )]

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

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

基类:

[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();
    }
}

图片:

The Character Custom Inspector

The Soldier Custom Inspector

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

1 个答案:

答案 0 :(得分:2)

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

此外,作为命名约定的注释,任何来自Editor的内容都应称为Editor。因此,为清楚起见,这些类应称为CharacterEditor和SoldierEditor。