C# 为什么可以';“我覆盖”;OnValidate();在Unity3D中?
所以我实现了一个从文本继承的曲线文本类。其中我有一个OnValidate实现: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
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语言规范的彻底屠杀。