Unity如何执行其方法?

bas*_*his 5 c# unity-game-engine

我只在Unity3D中有一点经验,但我注意到派生的类MonoBehaviour可能包含具有预定义签名的函数,这些函数将以特殊方式调用.例如,如果我写:

void Update()
{
  //some code
}
Run Code Online (Sandbox Code Playgroud)

每个帧都会调用此方法.

我想在Unity内部存在某种无限循环,它Update为场景中的每个对象调用每帧的方法.但是它如何知道对象实际上提供了Update方法实现呢?很明显,如果UpdateMonoBehaviour类中方法的覆盖,但是通过语法(以及您可以使用任何访问修饰符实现此类方法的事实)来判断它不是.那里有一些反思魔法吗?

Jer*_*ski 8

http://blogs.unity3d.com/2015/12/23/1k-update-calls/

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

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

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