Unity:2017.3.0f3
使用案例:点击时移动对象。
我经常看到Coroutine像以下一样移动物体。
private IEnumerator MoveTo(Vector2 position){
while (/*stop condition*/)
{
float newX = speed * Time.deltaTime;
transform.position = /*with newX*/
yield return null; // <-----------
}
}
我认为应该是:
private IEnumerator MoveTo(Vector2 position){
while (/*stop condition*/)
{
yield return null; // <-----------
float newX = speed * Time.deltaTime;
transform.position = /*with newX*/
}
}
我认为在大多数用例中我们必须等待下一帧执行移动操作,否则我们会考虑在我们设法移动对象之前已经过去的deltaTime。
您怎么看?我完全错了吗?
PS:我知道我们可以使用Update()和co。对于这种用例。
答案 0 :(得分:2)
你怎么看?我完全错了吗?
是的,你错了。第一个更正确。
想想更像是这样:
你想move从一个位置到另一个位置的物体,首先要做的是计算移动物体的距离,然后移动到那个位置,然后等待一个帧。你一遍又一遍地这样做,直到你到达目的地位置。这是第一个代码正在做的事情。
另一方面,第二个代码是先等待一个帧然后移动对象。为什么在开始运动之前等待一帧? 将会发生的情况是,当调用该函数直到下一帧将引入延迟时,该运动才会启动。除非这明确地是你想要的,否则你不应该使用它。
答案 1 :(得分:1)
根本没有错,但我想大部分时间都没有明显的差异?你的第二个版本在某种意义上会更准确,因为我认为这确实是预期的行为,在继续前进之前,对象在位置0处呈现一次。如果移动对象是用户控制的对象,我仍然认为第一种方法更适合,因为它会给用户提供最快的反馈/响应而没有任何延迟&#34;。对于动画来说,第二种方法会更好,因为首选渲染起始位置(特别是如果在动画开始之前对象甚至不可见),