Unity 2017.3.0f3中点击移动物体的协程写法合理性问询
两种Unity协程写法的差异与生命周期规范分析
首先得先搞懂Unity协程的执行时机——这是理解差异的核心:当你调用StartCoroutine后,协程会立即开始执行,直到遇到yield return语句才暂停;而yield return null会让协程在下一帧的Update()执行完毕后,再继续运行yield之后的代码。
现在拆解两种写法的具体行为:
1. 第一种写法(先执行移动,再yield)
private IEnumerator MoveTo(Vector2 position){ while (/*停止条件*/) { float newX = speed * Time.deltaTime; transform.position = /*赋值newX*/ yield return null; } }
- 第一帧行为:当你调用这个协程的瞬间(比如在
OnMouseDown、Update里),当前帧就会立刻执行移动逻辑,修改物体位置,然后才暂停等待下一帧。 - 后续帧行为:每一帧的
Update执行完后,会继续进入while循环,再次执行移动逻辑,然后yield暂停。
2. 第二种写法(先yield,再执行移动)
private IEnumerator MoveTo(Vector2 position){ while (/*停止条件*/) { yield return null; float newX = speed * Time.deltaTime; transform.position = /*赋值相关计算值*/ } }
- 第一帧行为:调用协程后,只会执行到
yield return null就暂停,当前帧不会有任何移动操作。 - 后续帧行为:从下一帧开始,每帧
Update执行完后,才会执行移动逻辑,修改位置,然后回到while判断,再次yield暂停。
哪种更符合Unity生命周期规范?
答案是第二种写法更贴合Unity的帧流程设计,原因如下:
- Unity的帧执行顺序是:输入事件处理 →
Update()→ 协程yield return null后的代码 →LateUpdate()→ 渲染。第二种写法让移动逻辑固定在Update之后执行,和所有每帧更新的逻辑保持一致的顺序,避免出现“移动逻辑在Update之前执行,导致其他依赖位置的Update逻辑出错”的问题。 - 第一种写法的首次执行时机不确定:如果是在输入事件(比如
OnMouseDown)里调用协程,移动逻辑会在Update之前就执行,打破了帧内逻辑的执行顺序,容易引发难以排查的时序bug。
当然,如果你需要点击后立即有视觉反馈(当前帧就移动),第一种写法也可以用,但这属于特殊需求,而非通用的规范写法。大多数情况下,遵循帧流程的统一顺序会让代码更稳定、更易维护。
内容的提问来源于stack exchange,提问作者puglic
相关产品推荐
相关产品推荐

