我在Unity3D中只有很少的经验,但我注意到派生自MonoBehaviour
的类可能包含具有预定义签名的函数,这些函数将以特殊方式调用。例如,如果我写:
void Update()
{
//some code
}
每个帧都会调用此方法。
我想在Unity内部存在某种无限循环,它为场景中的每个对象每帧调用Update
方法。但是它如何知道该对象实际上提供了Update
方法实现?很明显,如果Update
是MonoBehaviour
类中方法的覆盖,但是通过语法判断(以及您可以使用任何访问修饰符实现此类方法的事实),它是'不是。那里发生了一些反思魔法吗?
答案 0 :(得分:8)
http://blogs.unity3d.com/2015/12/23/1k-update-calls/
不,Unity不会使用System.Reflection来查找每个魔法 它需要打电话的时间。
相反,第一次访问给定类型的MonoBehaviour 通过脚本运行时检查底层脚本(或者 Mono或IL2CPP)是否有任何魔法方法定义和此 信息被缓存。如果MonoBehaviour有特定的方法 添加到正确的列表中,例如,如果脚本具有Update方法 定义它被添加到需要更新的脚本列表中 每一帧。
在游戏中,Unity只会遍历这些列表并执行 来自它的方法 - 那很简单。而且,这就是为什么无所谓 您的Update方法是公开的或私有的。