为什么MonoBehaviour方法不能被覆盖实现?

11
在Unity3d中,您有MonoBehaviour类,它是所有脚本的常规基类。在实现脚本时,必须实现诸如Awake()Start()Update()等方法。
然而,这些方法在MonoBehaviour类中未被实现为virtualabstract,因此人们不能轻松地对它们进行override;事实上它们根本没有被实现。当前编写的方法是该类之前不存在的新方法。
为什么这些方法在基类(MonoBehaviour)中没有被实现为virtualabstract呢?
1个回答

12

如果您查看文档,您会发现所有这些“函数”都列在“消息”部分中; MonoBehaviour Doc

这意味着“函数”(如Start、OnEnable或Awake),它们不是作为方法实现的,而是作为消息实现的。

现在,MonoBehaviour继承自Behaviour,后者又继承自Component,该组件具有SendMessage方法。该方法基本上调用一个带有选项报告消息/方法是否存在的消息/方法。名称消息/方法的参数是一个字符串,/~~所以他们在那里使用反射.~~/ 请检查更新!

似乎Unity在幕后决定这些消息是否已实现以确定是否需要调用它们。根据此UnityAnswer:
Unity主要使用c ++编写,因此大多数魔法发生在本地代码中。 Unity使用反射来确定在编译脚本后您已实现了哪些“事件”并记住该类。 仅当实现了Update / LateUpdate / OnGUI时,Unity才会调用它们。
因此,简短的答案是,它们不是您必须覆盖的“真正”方法,而是仅在实现了它们时才会调用的消息。

更新: 正如 @Raining 所指出的那样,我对 Unity 获取要调用的消息的方式是错误的。 Unity 不使用反射来执行此操作。 根据 1k-update-calls(也由 @Rainin 提供),脚本将被检查以查看它们是否包含某些“魔法方法”。如果是这样,它们将被添加到列表中,然后相应地执行。


注意,Unity不使用反射技术。 - VimNing
嗨@Raining,你能添加更多关于这个问题的信息吗?这样我就可以用正确的信息更新答案!谢谢! - mayo
你可以阅读这篇文章:https://blogs.unity3d.com/2015/12/23/1k-update-calls/ 感谢您愿意更新:) 这种心态使得论坛更好。 - VimNing
谢谢!感谢您提供的链接和解释! - mayo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接