【问题标题】:Lifecycle, Coroutine and deltaTime生命周期、协程和 deltaTime
【发布时间】:2018-04-19 10:02:02
【问题描述】:

统一:2017.3.0f3

用例:点击移动对象。

我经常看到像下面这样的协程来移动对象。

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

【问题讨论】:

    标签: c# unity3d coroutine


    【解决方案1】:

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

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

    你可以这样想:

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

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

    【讨论】:

    • 根据我对 Unity 生命周期的理解,在第一个代码中,您介绍了该操作在 deltaTime 秒前开始。
    • 没有。我没有提到Time.deltaTime;,这与这个问题无关。我谈到了等待帧,这仅与yield return null 有关。 yield return null 命令等待一帧。把它放在函数的开头而不是结尾等待一帧然后执行它下面的代码,没有理由这样做。
    • deltaTime 是最重要的,如果我们忽略它,第一个代码可能没问题。
    • 没有。同样,您的代码中唯一不同的是 yield return null; 的放置位置。就像我之前说过的,您的代码与 Time.deltaTime 的放置位置无关。 Time.deltaTime 仍然会做同样的事情,不管它放在哪里。重要的是yield return null; 的放置位置。 yield return null; 将等待一帧/暂停,然后再运行它下面的代码,而不是运行代码然后暂停。您不能阅读我的答案和 cmets 中的内容吗?你对什么感到困惑?
    • 如果您忽略deltaTime,没关系,因为您只想在当前帧中执行您的操作。否则,如果您使用deltaTime,则意味着您需要知道当前帧与上一帧之间经过的时间。这介绍了您的动作“从前一帧开始”,例如您计算在此经过的时间内完成的距离。没有?
    【解决方案2】:

    一点都没有错,但我想大多数时候它不会产生明显的差异?您的第二个版本在某种意义上会更准确,因为我认为这确实是预期的行为,即对象在继续之前在位置 0 处渲染一次。如果移动对象是用户控制的对象,我仍然认为第一种方法更适合,因为它可以在没有任何“延迟”的情况下向用户提供最快的反馈/响应。第二种方法更适用于希望同时渲染起始位置的动画(尤其是在动画开始之前对象甚至不可见的情况下),

    【讨论】:

      猜你喜欢
      • 2023-02-24
      • 2020-06-20
      • 2021-12-20
      • 2021-06-28
      • 2021-12-24
      • 2013-04-06
      • 1970-01-01
      • 2013-09-08
      • 2021-01-03
      相关资源
      最近更新 更多