为什么我不能在 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
那我现在该怎么办?我还应该提到,当脚本添加到场景中的对象时,它会按预期工作,并且不会引发任何错误。
因为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