首页 > 解决方案 > 为什么不统一完成 Update() 函数中的所有函数

问题描述

void Update() 可以每 1 帧执行功能。所以在脚本中,前喜欢 void OnTriggerEnter(){}。为什么不把它放在 update() 函数中。我知道这里有一些误解,但我无法向自己解释。此外,仅此而已void Update()void Start(){}统一的功能。包括一些类似的void OnTriggerEnter功能也可以统一运行因为它是内置函数。我们写的那些函数怎么样public void SwitchAvatar()。如果里面没有提到它是否可以运行void Update(){}。我知道上面的问题听起来很愚蠢,但不知道为什么我不能说出答案。所有非常感谢您的帮助。谢谢 !

标签: c#unity3d

解决方案


好吧,让我们打开关于 Unity 中魔法方法的潘多拉魔盒。

首先,您可以继承两种类型的类来访问魔术方法:MonoBehaviourScriptableObject. 它们都提供不同的东西,后者主要用于序列化场景外的数据。此外,ScriptableObject与 MonoBehaviour 相比,具有更少的魔法方法。

第二:AMonoBehaviour有一个生命周期。您在此生命周期中所处的位置决定了引擎调用哪些方法。

下图向您展示了 a 的整个生命周期MonoBehaviour:( 来源:Unity - 手册:事件函数的执行顺序

如您所见,对象被实例化并被Awake调用。在第一次Update调用之前,引擎会调用该Start方法。AwakeStart:之间有区别,Awake可与构造函数相媲美。它在没有任何外部保证存在的情况下被调用(就像你的其他组件一样GameObject)。当Start被调用时,对象上的所有其他组件都被初始化并且可以通过GetComponent调用来访问。

现在到UpdateFixedUpdate以及所有其他事件:
Unity 有两个独立的循环循环。一个用于物理,一个用于其他所有方面。因为计算物理很昂贵并且需要精度,所以它被称为固定的、不同的时间步长。您实际上可以在“时间”选项卡的项目设置中设置它们。
现在,如果您想修改与物理相关的任何内容(例如刚体的速度),您应该在 中执行此操作FixedUpdate,因为它与物理引擎(PhysX 或 Box2D,取决于您对碰撞器的使用)在同一时间步内运行。
另一方面,更新会尽可能频繁地运行。通过调用可以观察到当前两次Update调用之间的时间距离Time.deltaTime,也就是两次Update调用之间经过的时间Update来电。请注意,Time.fixedDeltaTime它始终是相同的,因为它是两个物理调用之间的时间。
其他事件方法被调用作为对编辑器内部更新循环、渲染循环或物理循环的响应。每当一个物体在物理计算中发生碰撞时,OnCollisionEnter就会被调用。请注意,这不可能发生在 之外Update,因为正如我们所知,Update它不用于计算物理。


好的,一个 tl;dr:并不是生命周期中存在的唯一方法
Start,有很多方法,每个都有其目的。物理在调用该方法时以不同的时间尺度计算,因此不能属于.UpdateMonoBehaviourUpdateUpdate


还有一件事要带走:您应该真正阅读您正在使用的游戏引擎的手册。当你为实时应用程序编写代码时,你应该知道很多东西,如果你构建到现有的游戏引擎上,你应该定期检查文档。尤其是 Unity 的文档对于代码和编辑器的使用来说都是一本很好的读物。


推荐阅读