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

本文关键字:OnValidate 覆盖 不能 Unity3D 为什么 | 更新日期: 2023-09-27 17:58:47

所以我正在实现一个从文本继承的弯曲文本类。在其中,我有这个OnValidify实现:

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 建议覆盖。那么我接下来该怎么做呢?删除覆盖关键字并忽略 VS 警告。所以现在 Unity 抛出这个错误:

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

那我现在该怎么办?我还应该提到,当脚本添加到场景中的对象时,它会按预期工作,并且不会引发任何错误。

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

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

正如本博客所提到的,此消息传递功能仅在以下情况下解决 首次访问 MonoBehavior 对象,并通过脚本运行时(Mono 或 IL2CPP(检查底层脚本。

所以现在,对于编译者来说,这不是可以覆盖OnValidate

只需像这样调用该方法:

void OnValidate()
{
   // some other code
}

我的 2 美分评论

  • protected关键字不会阻止内容被覆盖。

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

如果仅使用预处理器指令显式地将其设置为编辑器,则可以覆盖OnValidate()

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

因此,您可以通过在覆盖OnValidate()时使用预处理器指令#if UNITY_EDITOR来防止 VS 投诉和编译器错误。这也更明确地说明了代码的作用,而不是依赖于对 Unity 内部的洞察力,因此更具可读性。

它可能作为仅编辑器代码隐藏在幕后的构建中,但是当它被覆盖时,该hack会以某种方式被破坏。

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