为什么我不能在Unity3D中覆盖“OnValidate()”?

时间:2016-07-27 12:36:48

标签: c# unity5

所以我正在实现一个继承自Text的弯曲Text类。在其中我有这个OnValidate实现:

protected override  void OnValidate()
{
  base.OnValidate();
  // some other code
}

现在,当我尝试构建项目时,我收到此错误:

error CS0115: CurvedText.OnValidate() is marked as an override but no suitable method found to override

所以那时我很好,即使VS建议压倒一切也很奇怪。那我接下来该怎么办?删除override关键字并忽略VS警告。所以现在团结会抛出这个错误:

error CS0117: UnityEngine.UI.Text does not contain a definition for OnValidate 

那我现在该怎么办?我还应该提一下,当脚本被添加到场景中的对象时,它的工作方式与预期的一样,并且不会抛出任何错误。

2 个答案:

答案 0 :(得分:2)

因为OnValidate是Unity3D消息系统的一部分。

正如this blog提到的那样,这个消息传递功能只会解决  首次访问MonoBehaviour对象,并通过脚本运行时(Mono或IL2CPP)检查基础脚本。

所以现在,对于编译器来说,不能覆盖OnValidate

只需调用这样的方法:

void OnValidate()
{
   // some other code
}

我对评论的2分,

  • protected关键字不会阻止事件被覆盖。

  • virtual关键字用于修改内容并允许在派生类中重写它们。这意味着您无法覆盖非虚方法。

答案 1 :(得分:0)

OnValidate()的Unity文档指出“ 仅在编辑器中调用”: https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnValidate.html

在覆盖#if UNITY_EDITOR时使用预处理指令OnValidate()可以防止VS投诉和编译器错误。这也更清楚地说明了代码的功能,而不是依赖于对Unity内部结构的了解,因此更具可读性。

它可能是作为仅编辑器的代码隐藏在幕后版本中的,但是该hack在被重写时以某种方式被破坏了。

#if UNITY_EDITOR
    protected override void OnValidate()
    {
        // Do something.
    }
#endif // UNITY_EDITOR