Unity private唤醒更新和启动方法如何工作?

Unity如何调用场景背后的Awake,Update和Start方法? 他们没有访问修饰符表示它们是私有方法,并且它们不使用new或override之类的东西,那么Unity框架如何找到调用它们的方法?

在一个相关的问题上,是否有任何特殊原因没有使用虚拟方法?

编辑:对于那些不熟悉Unity脚本的人来说,这是他们通常出现的方式:

public class MyClass : MonoBehaviour{ void Start(){ } void Awake(){ } void Update(){ } } 

我不明白的是框架如何找到并自动调用每个脚本的那些方法,从各方面看,它们看起来只是私有方法

以下是Unity博客文章中的一条信息

如何更新已被呼叫

不,Unity每次需要调用时都不会使用System.Reflection来查找魔术方法。

相反,第一次访问给定类型的MonoBehaviour时,底层脚本将通过脚本运行时(Mono或IL2CPP)进行检查,无论它是否定义了任何魔术方法,并且此信息都被缓存。 如果MonoBehaviour具有特定方法,则会将其添加到正确的列表中,例如,如果脚本定义了Update方法,则会将其添加到需要每帧更新的脚本列表中。

在游戏中,Unity只是遍历这些列表并从中执行方法 – 这很简单。 此外,这就是为什么Update方法是公共的还是私有的并不重要。

方法不是虚拟的原因是性能。 如果它是虚拟的,那么每一个MonoBehaviour都需要所有相关的方法(Start,Awake,Update,FixedUpdate等),这是一件坏事。