【问题标题】:Unity: Custom Editor for inherited Event PropertyUnity:继承的事件属性的自定义编辑器
【发布时间】:2021-01-04 22:21:58
【问题描述】:

假设我有这个设置

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

public class MyChild : SomeClassMadeByUnity
{
    
}

SomeClassMadeByUnity 在封闭源代码下有一个自定义编辑器,但我想自己在自​​定义编辑器中公开someEvent

我该怎么做?

【问题讨论】:

  • 它需要是一个属性吗? Unity 不序列化属性
  • 由于该类是由 Unity (XRBaseInteractable btw) 提供的,所以我真的无能为力。
  • 那么我们可能也不能从这里做很多事情。对于自定义编辑器,您至少需要知道字段名称(不是公共属性,也不是 Inspector 中显示的属性,而是实际的字段名称)。如果他们是私人的,你当然可以暴力破解,直到你有正确的名字,但这不是我们可以帮助的;)

标签: c# unity3d


【解决方案1】:

这里不需要/使用自定义编辑器。

“问题”是 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
{
    
}

或者,如果您已经有父类型的自定义编辑器,您只需确保在 CustomEditor 中传递 true

editorForChildClasses

如果true,inspectedType 的子类也会显示这个编辑器。默认为false

【讨论】:

  • Unity 为这个类 (XRBaseInteractable) 提供了一个自定义编辑器,但我不想在检查器上显示每个属性,因为我不需要它们中的大部分。
  • 也许你应该发布你的实际用例..
【解决方案2】:

您可以为您的 MyChild 类编写自定义编辑器,扩展 SomeClassMadeByUnity 的自定义编辑器。但是,如果 SomeClassMadeByUnity 的自定义编辑器被公开。因此,假设 SomeClassMadeByUnityEditorSomeClassMadeByUnity 的编辑器脚本,您可以这样做:

[CustomEditor(typeof(MyChild))]
public class MyChildEditor : SomeClassMadeByUnityEditor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();    // To execute OnInspectorGUI logic of parent class.
        // Do some exposing SomeEvent logic.
    }
    
    // Or if parent class uses CreateInspectorGUI instead
    public override VisualElement CreateInspectorGUI()
    {
        var root = base.CreateInspectorGUI();
        // Do some exposing SomeEvent logic.
        return root;
    }
}

【讨论】:

  • 如果我理解正确的话,这仍然会显示SomeClassMadeByUnity 的所有属性,而我不需要其中的大部分。
  • @MarekLegris 啊,我可能没有正确理解您的意图。因此,您可以像通常制作自定义编辑器一样从 Editor 继承您的 MyChildEditor
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
相关资源
最近更新 更多