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

时间:2017-02-19 08:13:20

标签: c# design-patterns unity3d unity5

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

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

编辑:对于那些不熟悉Unity脚本的用户,通常会出现这种情况:

    ./a.out ff ee gg tt hh oo ee pp
Child : 1, pid 762 : ff hh 
Child : 3, pid 764 : gg ee 
Child : 2, pid 763 : ee oo 
Father : 4 childs created
Child : 4, pid 765 : tt pp 

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

2 个答案:

答案 0 :(得分:1)

以下是Unity blog post

中的一条信息
  

如何更新

     

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

     

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

     

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

答案 1 :(得分:1)

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