生命周期,协同程序和deltaTime

时间:2018-04-19 10:02:02

标签: c# unity3d coroutine

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。对于这种用例。

2 个答案:

答案 0 :(得分:2)

  你怎么看?我完全错了吗?

是的,你错了。第一个更正确。

想想更像是这样:

你想move从一个位置到另一个位置的物体,首先要做的是计算移动物体的距离,然后移动到那个位置,然后等待一个帧。你一遍又一遍地这样做,直到你到达目的地位置。这是第一个代码正在做的事情。

另一方面,第二个代码是先等待一个帧然后移动对象。为什么在开始运动之前等待一帧? 将会发生的情况是,当调用该函数直到下一帧将引入延迟时,该运动才会启动。除非这明确地是你想要的,否则你不应该使用它。

答案 1 :(得分:1)

根本没有错,但我想大部分时间都没有明显的差异?你的第二个版本在某种意义上会更准确,因为我认为这确实是预期的行为,在继续前进之前,对象在位置0处呈现一次。如果移动对象是用户控制的对象,我仍然认为第一种方法更适合,因为它会给用户提供最快的反馈/响应而没有任何延迟&#34;。对于动画来说,第二种方法会更好,因为首选渲染起始位置(特别是如果在动画开始之前对象甚至不可见),