Answers:
如何调用更新
不,Unity每次需要调用一个方法时都不会使用System.Reflection查找魔术方法。
相反,第一次访问给定类型的MonoBehaviour时,将通过脚本运行时(Mono或IL2CPP)检查基础脚本是否定义了任何魔术方法,并缓存此信息。如果MonoBehaviour具有特定的方法,则会将其添加到适当的列表中,例如,如果脚本定义了Update方法,则会将其添加到需要每帧更新的脚本列表中。
在游戏过程中,Unity只需遍历这些列表并从中执行方法-就这么简单。同样,这就是为什么Update方法是公共的还是私有的都没关系的原因。
由于这样做的原因,我将主要向您(读者)介绍DMGregory的答案,该答案归结为两个相互矛盾的方面的平衡:
一个新的开发人员只希望它能够正常工作,而不必弄清楚“如何将它连接到事件系统?” 但它仍应以最小的开销快速运行。
在这两个约束内,解决方案可能是最好的。或者至少是当时Unity开发团队能够提供的最好的工具。我们可能永远不会知道。
它可以简单地将方法定义为MonoBehaviour基类中的抽象方法,并强制子类实现该方法。
Unity使用的系统的优点之一是您不必实现每个MonoBehaviour消息,该消息有60多个。
通常,我们只需要这些方法中的一种或几种即可。由于某些特定于2D / 3D物理,某些特定于相机或粒子系统,因此几乎没有任何一个脚本会需要所有这些脚本。
通过将不需要的消息保留为未实现,我们可以清楚地向运行时发出信号:“甚至不必费心在该对象上调用OnCollisionStay2D-我不需要它”
这可以是巨大的效率优势。现在,引擎可以筛选出一个短列表,以仅对场景中每帧需要自定义更新逻辑的〜20个对象调用Update,而不是构成所有场景或仅对物理事件做出响应的所有〜200个对象。