c# - Unity中的自定义编辑器继承

标签 c# unity-game-engine inheritance editor

已解决,修复在代码中

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

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

我尝试使用[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();
    }
}

图片:

The Character Custom Inspector

The Soldier Custom Inspector

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

最佳答案

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

此外,注释就像命名约定一样,任何从 Editor 派生的东西都应该称为 Editor。因此,为了清楚起见,这些类应该称为CharacterEditor 和SoldierEditor。

关于c# - Unity中的自定义编辑器继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54315854/

相关文章:

c# - Azure Functions 绑定(bind)重定向

unity-game-engine - 为什么我对 OnCollisionEnter() 的定义没有被使用?

音乐开始播放的 iOS 通知

c# - 使子类无法覆盖方法实现

.net - 抽象类 : Which exception should I throw when child classes aren't implemented correctly?

c# - 将纬度和经度转换为 double 值的最简单方法是什么

c# - 将参数传递给使用 MSTest.exe 从命令行运行的编码 UI 测试

c# - 捕获从应用程序发送和发送到应用程序的所有数据包

Unity中的Android本地通知

c++ - 虚拟继承实际上是如何工作的?