Unity 的游戏循环机制
Unity 的游戏循环机制
在 Unity 中,游戏的运行是基于帧的。每一帧都遵循固定的执行顺序:
处理输入
执行游戏逻辑 (包括 Update、FixedUpdate 和协程)
渲染场景
显示帧
为什么 GameTime.time
在同一帧内不变
GameTime.time
是只读属性:
它返回的是当前帧开始时刻的时间戳
在同一帧的所有代码执行过程中,这个值保持不变
只有在下一帧开始时,Unity 引擎才会更新这个值
代码执行与时间推进的关系:
您的代码是在一帧内的「执行游戏逻辑」阶段运行的
在这一阶段,时间还没有「推进」,
GameTime.time
保持固定只有当这一帧完全结束,进入下一帧时,时间才会更新
举例说明Bug
while (GameTime.time - begin <= 0.03f) // 条件永远为 true
{var lerp = (GameTime.time - begin) / 0.03f; // 永远是 0/0.03 = 0yMouse = Mathf.Lerp(_y_mouse, cameraConfig.y_mouse, lerp); // 永远是起始值distanceFromTarget = Mathf.Lerp(...); // 同上// 没有 yield return,循环继续立即执行下一轮// GameTime.time 仍然是 10.0,因为还在同一帧
}
在第一轮计算:
GameTime.time - begin = 0
≤ 0.03 → 继续在第二轮计算:
GameTime.time - begin = 0
≤ 0.03 → 继续在第三轮计算:
GameTime.time - begin = 0
≤ 0.03 → 继续...无限循环,因为
GameTime.time
不会改变
为什么这一帧始终无法进入下一帧?
1、首先我们要知道——Unity是帧更新机制,包括GameTime.time
2、又因为GameTime.Time需要下一帧进行更新,但GameTime.Time又作为循环条件,这一帧的内容始终在While循环中
使用协程方法yield return new WaitForEndOfFrame
的原因
为什么
yield return
能解决这个问题
yield return new WaitForEndOfFrame()
的作用是:
暂停当前协程的执行
允许当前帧完成(完成渲染等所有操作)
在下一帧继续执行协程
此时
GameTime.time
已经更新为下一帧开始的时间所以,有了
yield return
:
第1帧:执行一次循环,然后暂停
第2帧:
GameTime.time
已更新,再次执行循环第3帧:
GameTime.time
再次更新,可能已经超过 0.03 秒,循环结束
之后的话题:如何理解一帧的内容
这一帧的内容为什么是while循环,还有其他代码属于这一帧的内容吗,如何判断哪些代码属于一个帧内的?
如何判断哪些代码属于同一个帧?
有一个非常简单的判断原则:所有在同一个“游戏逻辑处理阶段”被连续调用的代码,都属于同一帧。
更具体地说,在Unity的主循环中,一帧内按顺序会发生很多事,下图清晰地展示了这一流程以及您的代码是如何被嵌入执行的: