所以我正在实现一个继承自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
那我现在该怎么办?我还应该提一下,当脚本被添加到场景中的对象时,它的工作方式与预期的一样,并且不会抛出任何错误。
答案 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