c# - 为什么不统一完成 Update() 函数中的所有函数
问题描述
void Update() 可以每 1 帧执行功能。所以在脚本中,前喜欢
void OnTriggerEnter(){}
。为什么不把它放在 update() 函数中。我知道这里有一些误解,但我无法向自己解释。此外,仅此而已void Update()
,void Start(){}
统一的功能。包括一些类似的void OnTriggerEnter
功能也可以统一运行因为它是内置函数。我们写的那些函数怎么样public void SwitchAvatar()
。如果里面没有提到它是否可以运行void Update(){}
。我知道上面的问题听起来很愚蠢,但不知道为什么我不能说出答案。所有非常感谢您的帮助。谢谢 !
解决方案
好吧,让我们打开关于 Unity 中魔法方法的潘多拉魔盒。
首先,您可以继承两种类型的类来访问魔术方法:MonoBehaviour
和ScriptableObject
. 它们都提供不同的东西,后者主要用于序列化场景外的数据。此外,ScriptableObject
与 MonoBehaviour 相比,具有更少的魔法方法。
第二:AMonoBehaviour
有一个生命周期。您在此生命周期中所处的位置决定了引擎调用哪些方法。
下图向您展示了 a 的整个生命周期MonoBehaviour
:(
来源:Unity - 手册:事件函数的执行顺序)
如您所见,对象被实例化并被Awake
调用。在第一次Update
调用之前,引擎会调用该Start
方法。Awake
和Start
:之间有区别,Awake
可与构造函数相媲美。它在没有任何外部保证存在的情况下被调用(就像你的其他组件一样GameObject
)。当Start
被调用时,对象上的所有其他组件都被初始化并且可以通过GetComponent
调用来访问。
现在到Update
,FixedUpdate
以及所有其他事件:
Unity 有两个独立的循环循环。一个用于物理,一个用于其他所有方面。因为计算物理很昂贵并且需要精度,所以它被称为固定的、不同的时间步长。您实际上可以在“时间”选项卡的项目设置中设置它们。
现在,如果您想修改与物理相关的任何内容(例如刚体的速度),您应该在 中执行此操作FixedUpdate
,因为它与物理引擎(PhysX 或 Box2D,取决于您对碰撞器的使用)在同一时间步内运行。
另一方面,更新会尽可能频繁地运行。通过调用可以观察到当前两次Update调用之间的时间距离Time.deltaTime
,也就是两次Update调用之间经过的时间Update
来电。请注意,Time.fixedDeltaTime
它始终是相同的,因为它是两个物理调用之间的时间。
其他事件方法被调用作为对编辑器内部更新循环、渲染循环或物理循环的响应。每当一个物体在物理计算中发生碰撞时,OnCollisionEnter
就会被调用。请注意,这不可能发生在 之外Update
,因为正如我们所知,Update
它不用于计算物理。
好的,一个 tl;dr:并不是生命周期中存在的唯一方法
Start
,有很多方法,每个都有其目的。物理在调用该方法时以不同的时间尺度计算,因此不能属于.Update
MonoBehaviour
Update
Update
还有一件事要带走:您应该真正阅读您正在使用的游戏引擎的手册。当你为实时应用程序编写代码时,你应该知道很多东西,如果你构建到现有的游戏引擎上,你应该定期检查文档。尤其是 Unity 的文档对于代码和编辑器的使用来说都是一本很好的读物。
推荐阅读
- python - 在 Flask 中下载多个文件
- z3 - 量词 + 未解释函数的 Z3 使用建议
- c++ - 架构 arm64 的未定义符号:m1 mac
- javascript - 如何在来自 html 的跨源本地存储之间共享数据以响应 iFrame?
- python - 通过特定值重新采样和插值 Dataframe
- java - 即使当时服务器没有启动,如何确保执行一次运行的石英作业?
- laravel-8 - 作曲家需要 designmynight/laravel-mongodb-passport 未安装在 laravel8 中
- c# - 失去焦点时自定义文本框值消失
- laravel - 未找到 Laravel 8 路线
- angular - Wait for subscription in the same function