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
我不明白的是框架如何找到并自动调用每个脚本的方法,从各方面来看,它们看起来只是私有方法
答案 0 :(得分:1)
如何更新
不,Unity每次需要调用时都不会使用System.Reflection查找魔术方法。
相反,第一次访问给定类型的MonoBehaviour时,将通过脚本运行时(Mono或IL2CPP)检查基础脚本是否已定义任何魔术方法并且此信息已缓存。如果MonoBehaviour具有特定方法,则会将其添加到正确的列表中,例如,如果脚本定义了更新方法,则会将其添加到需要每帧更新的脚本列表中。
在游戏中,Unity只是遍历这些列表并从中执行方法 - 就这么简单。此外,这就是为什么你的Update方法是公共的还是私有的并不重要。
答案 1 :(得分:1)
方法不是虚拟的原因是性能。如果它是虚拟的,那么每一个MonoBehaviour都需要所有相关的方法(Start,Awake,Update,FixedUpdate等),这是一件坏事。