C# Unity:继承事件属性的自定义编辑器

C# Unity:继承事件属性的自定义编辑器,c#,unity3d,C#,Unity3d,假设我有这个设置 public class SomeClassMadeByUnity { public int someUnneededVariable; public UnityEvent someEvent { get; set; } } public class MyChild : SomeClassMadeByUnity { } SomeClassMadeByUnity在封闭源代码下有一个自定义编辑器,但我想自己在自定义编辑器中公开someEvent 我该怎

假设我有这个设置

public class SomeClassMadeByUnity
{
    public int someUnneededVariable;
    public UnityEvent someEvent { get; set; }
}

public class MyChild : SomeClassMadeByUnity
{
    
}
SomeClassMadeByUnity
在封闭源代码下有一个自定义编辑器,但我想自己在自定义编辑器中公开
someEvent


我该怎么做呢?

您可以为MyChild类编写自定义编辑器,扩展SomeClassMadeByUnity的自定义编辑器。但如果某个ClassMadebunity的自定义编辑器公开为公共。假设SomeClassMadeByUnity编辑器是SomeClassMadeByUnity的编辑器脚本,您可以执行以下操作:

[CustomEditor(typeof(MyChild))]
公共类MyChildEditor:SomeClassMadeByUnityEditor
{
公共覆盖无效OnInspectorGUI()
{
base.OnInspectorGUI();//执行父类的OnInspectorGUI逻辑。
//执行一些事件逻辑。
}
//或者如果父类改用CreateInspectorGUI
公共重写VisualElement CreateInspectorGUI()
{
var root=base.CreateInspectorGUI();
//执行一些事件逻辑。
返回根;
}
}

这里实际上不需要/使用自定义编辑器

“问题”是Unity没有序列化属性。因此,自定义编辑器不会有多大帮助。即使您设法在Inspector中公开了这样一个字段,它的任何更改也不会被存储

实际上,您只需要一个序列化的支持字段,如

[Serializable]
public class SomeClass
{
    public int someUnneededVariable;

    // You probably wouldn't need the setter anyway 
    public UnityEvent someEvent { get => _someEvent; set => _someEvent = value; }

    [SerializeField] private UnityEvent _someEvent;
}

[Serializable]
public class MyChild : SomeClass
{
    
}

或者,如果您已经有了父类型的自定义编辑器,您可以简单地确保传入
true
in

editorforchildclass

如果
true
,则inspectedType的子类也将显示此编辑器。默认值为
false


它需要是一个财产吗?属性不是由Unity序列化的,因为这个类是由Unity提供的(XRBaseInteractable btw),我真的没有什么可以做的。那么我们可能也不能从这里做很多。对于自定义编辑器,您至少需要知道字段名(不是公共属性,也不是在检查器中显示的属性,而是实际的字段名)。如果他们是私人的,你当然可以使用暴力,直到你有了正确的名字,但这不是我们可以帮助的;)Unity为这个类提供了一个自定义编辑器(XRBaseInteractable),但我不想显示inspector上的每个属性,因为我不需要大部分。也许你应该发布你的实际用例。如果我理解正确,这仍然会显示
SomeClassMadeByUnity
的每个属性,而我不需要大部分。@MarekLegris啊,我可能没有正确理解你的意图。所以,您可以从编辑器继承MyChildEditor,就像您通常创建自定义编辑器一样。