代码之家  ›  专栏  ›  技术社区  ›  WonderfulWonder

Unity-IEnumerator的收益率返回null

  •  19
  • WonderfulWonder  · 技术社区  · 8 年前

    我目前正在尝试理解IEnumerator&在Unity的上下文中进行协程,我对“yield-return-null”的性能不太自信。目前,我认为它基本上会暂停并等待下一帧,在下一帧中,它将返回执行while语句。

    如果我省略“yield return null”,对象似乎会立即移动到其目的地,或者“跳过很多帧”。所以我想我的问题是,在这个while循环中,这个“yield-return-null”函数是如何实现的,为什么有必要这样做呢。

    void Start () {
        StartCoroutine(Move());
    }
    
    IEnumerator Move(){
    
        while (a > 0.5f){
    
            ... (moves object up/down)
    
            yield return null; // <---------
        }
    
        yield return new WaitForSeconds(0.5f);
    
        .... (moves object up/down)
    
        StartCoroutine(Move());
    }
    
    2 回复  |  直到 8 年前
        1
  •  38
  •   Community Neeleshkumar S    5 年前

    程序将启动循环,如果没有产量,它只在同一帧内运行所有迭代。 如果您有数百万次迭代,那么它很可能会阻止您的程序,直到所有迭代完成,然后继续。

    创建协程时,Unity将其附加到单行为对象。它将在调用时首先运行startcroutine,直到达到产量。然后,它将从协程返回,并基于产量将其放置到堆栈上。如果生成null,则它将在下一帧再次运行。有许多不同的YieldInstruction可以从协程返回,您可以阅读更多关于它们的信息 here and through the related links .

    一旦协程已经产生,主线程将继续运行。在下一帧中,Unity将找到堆叠的协程,并从他们在屈服时停止的位置调用它们。 如果您的协程从未超出范围,那么您基本上创建了一个更新方法。

    协程的目的是在不阻塞程序的情况下执行可以跨越一段时间的操作。

    重要事实:这不是多线程。

        2
  •  10
  •   Max Auer    8 年前

    你说得对。 yield return null 将等待下一帧,然后继续执行。在您的情况下,它将在下一帧检查while循环的条件。

    “为什么这是必要的”可能是因为您希望对象每帧移动一个输入。没有 收益率返回null 它只是在一帧中通过while循环执行。

    更重要的是:看起来你想 Update 每一帧并调整psoition。您可以轻松使用 Update () 为此。Unity将在活动脚本上的每个帧调用此函数。