Unity如何执行其方法?

10

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

void Update()
{
  //some code
}

这个方法将在每一帧被调用。

我想在Unity内部有一个无限循环,为场景中的每个对象调用Update方法。但是它如何知道对象实际上提供了Update方法的实现?如果UpdateMonoBehaviour类中方法的重写,那么这将是清晰明了的,但从语法(以及您可以使用任何访问修饰符来实现此类方法)来看,它并不是。是否有一些反射魔法在发生?


简短的回答是它们使用预处理魔法来处理那些“准函数”。你可以Google许多解释。永远不要忘记游戏引擎是基于帧的系统,这都有点不同! - Fattie
1个回答

13

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

不,Unity并不使用System.Reflection来找到每次需要调用方法时的魔法方法。相反,当第一次访问给定类型的MonoBehaviour时,通过脚本运行时(Mono或IL2CPP)检查底层脚本是否定义了任何魔法方法,并将此信息缓存。如果MonoBehaviour具有特定方法,则将其添加到适当的列表中,例如,如果脚本定义了Update方法,则将其添加到需要每帧更新的脚本列表中。在游戏期间,Unity只是遍历这些列表并执行其中的方法-就是这么简单。此外,这就是为什么您的Update方法是公共的还是私有的都无关紧要的原因。

正是我想要的!非常感谢! - bashis
我很高兴能够帮忙。干杯。顺便说一下,这篇博客文章有更多有趣的信息。 - Jerry Switalski
所以,事实证明他们确实使用了某种反射,只是不是 System.Reflection - bashis
博客作者所说的是,他们不会每次需要调用魔术方法时都使用反射。我的猜测是,他们在使用Mono时仍然会使用System.Reflection - Jerry Switalski
由于某些错误操作或其他原因,该列表可能会变为空,并且没有调用任何更新方法?我之所以问这个问题是因为在我的项目中没有协程和更新方法被执行。 - Jotarata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接