Наследование пользовательских редакторов в Unity - PullRequest
0 голосов
/ 22 января 2019

решено , исправление в коде

У меня есть класс, для которого я хочу создать собственный редактор, но я не могу заставить его работать.

Я наследую классы друг от друга, и я хочу, чтобы редактор для базового класса применялся ко всем редакторам подклассов

Я пытался использовать [CustomEditor( typeof( BaseClassName ), true )], согласно Документация Unity предполагается, что работает.

Но пока что только у базового класса есть собственный редактор, а подклассы получают созданный мной пользовательский редактор, игнорируя инспектор базового класса.

Я также пытался унаследовать от пользовательского класса редактора, который я создал для базового класса, но он не работал…

Базовый класс:

[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 голосов
/ 22 января 2019

Когда вы переопределяете редактор символов, вы никогда не вызываете базовые методы.Вам нужно добавить base.OnEnable ();в метод OnEnable редактора солдата и в base.OnInspectorGUI ();в метод OnInspectorGUI редактора Soldier, чтобы они могли использовать функциональные возможности базового класса.

Кроме того, примечание, как и соглашение об именах, все, что происходит от Editor, должно называться Editor.Итак, для ясности, эти классы должны называться CharacterEditor и SoldierEditor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...