C# 为什么可以';“我覆盖”;OnValidate();在Unity3D中?

C# 为什么可以';“我覆盖”;OnValidate();在Unity3D中?,c#,unity5,C#,Unity5,所以我实现了一个从文本继承的曲线文本类。其中我有一个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

所以我实现了一个从文本继承的曲线文本类。其中我有一个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
error CS0117: UnityEngine.UI.Text does not contain a definition for OnValidate 
然后我就没事了,这是维德,甚至比建议更重要。那我下一步怎么办?删除override关键字并忽略VS警告。现在unity抛出了这个错误:

error CS0115: CurvedText.OnValidate() is marked as an override but no suitable method found to override
error CS0117: UnityEngine.UI.Text does not contain a definition for OnValidate 

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

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

如前所述,只有在 首次访问MonoBehavior对象,并通过脚本运行时(Mono或IL2CPP)检查底层脚本

所以现在,对于编译器来说,没有要覆盖的
OnValidate

只需按如下方式调用该方法:

void OnValidate()
{
   // some other code
}

我的2分钱给评论

  • protected
    关键字不能防止内容被覆盖

  • virtual
    关键字用于修改内容,并允许在派生类中重写这些内容。这意味着您不能重写非虚拟方法


    • 因为
      OnValidate
      是Unity3D信息系统的一部分

      如前所述,只有在 首次访问MonoBehavior对象,并通过脚本运行时(Mono或IL2CPP)检查底层脚本

      所以现在,对于编译器来说,没有要覆盖的
      OnValidate

      只需按如下方式调用该方法:

      void OnValidate()
      {
         // some other code
      }
      

      我的2分钱给评论

      • protected
        关键字不能防止内容被覆盖

      • virtual
        关键字用于修改内容,并允许在派生类中重写这些内容。这意味着您不能重写非虚拟方法


      • OnValidate()
        的Unity文档声明“仅在编辑器中调用”:

        重写
        OnValidate()
        时,使用预处理器指令
        #if UNITY_EDITOR
        ,可防止VS投诉和编译器错误。这也更加明确了代码的作用,而不是依赖于对Unity内部的洞察,因此更具可读性

        它可能是作为一个纯编辑器代码隐藏在后台构建中的,但当它被重写时,这种攻击不知何故被破坏了

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

        OnValidate()
        的Unity文档声明“仅在编辑器中调用”:

        重写
        OnValidate()
        时,使用预处理器指令
        #if UNITY_EDITOR
        ,可防止VS投诉和编译器错误。这也更加明确了代码的作用,而不是依赖于对Unity内部的洞察,因此更具可读性

        它可能是作为一个纯编辑器代码隐藏在后台构建中的,但当它被重写时,这种攻击不知何故被破坏了

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

        基类中没有用于重写的OnValidate,但问题是确实存在。根据参考资料,
        OnValidate
        不是
        virtual
        ,因此无法覆盖它。这可能只是脚本引用不准确,但既然VS同意,这可能是真的。“protected void OnValidate();”不是虚拟的。我注意到Unity3D是首先设计JavaScript的,所以它不一定遵循良好的C#实践。这包括处理继承的方式
        OnValidate
        和friends被认为是消息,而不是方法,它们不是虚拟的,相反,好吧,Unity手动处理虚拟分派。在基类中没有OnValidate进行重写,但事实上是存在的。根据参考资料,
        OnValidate
        不是
        virtual
        ,因此无法覆盖它。这可能只是脚本引用不准确,但既然VS同意,这可能是真的。“protected void OnValidate();”不是虚拟的。我注意到Unity3D是首先设计JavaScript的,所以它不一定遵循良好的C#实践。这包括处理继承的方式
        OnValidate
        和friends被认为是消息,而不是方法,它们不是
        虚拟的
        ——相反,AFAIK,Unity手动处理虚拟分派。好的,这在构建和编辑器中都有效,但现在VS抱怨我隐藏了继承的成员。我想只有一条绿线我就能活下去。谢天谢地,昨天我无意中发现了这篇博文。没问题!“这并不意味着它错了。”对我来说,听起来像是对C语言规范的彻底屠杀。好吧,这在构建和编辑器中都有效,但现在VS抱怨我隐藏了继承的成员。我想只有一条绿线我就能活下去。谢天谢地,昨天我无意中发现了这篇博文。没问题!“这并不意味着它错了。”对我来说,听起来像是对C语言规范的彻底屠杀。