如何理解这个Unity协程?

using UnityEngine;
using System.Collections;

public class CoroutineExample : MonoBehaviour
{
    IEnumerator Start ()
    {
        print ("Starting " + Time.time);
        yield return StartCoroutine (WaitAndPrint ());
        print ("Done " + Time.time);
    }

    IEnumerator WaitAndPrint ()
    {
        yield return new WaitForSeconds (5f);
        print ("WaitAndPrint " + Time.time);
    }
}

结果是

Starting 0
WaitAndPrint 5.010554
Done 5.010554

我有两个问题?

首先,如何理解函数Start()的返回值。 我曾经看到Start()的返回值是void。 在我看来,Start()只能通过Unity执行一次(一帧),但是yield返回似乎使Start()函数在两帧中执行;

其次,我也对结果感到困惑。 我认为结果应该是

Starting 0
Done 5.010554
WaitAndPrint 5.010554

因为StartCoroutine()启动WaitAndPrint()函数。 在函数WaitAndPrint()中,yield return使此函数在此框架中暂停并返回到Start()。 然后开始()继续并打印“完成xxxxx”。 5秒后,WaitAndPrint()继续并打印“WaitAndPrint xxxxx”。

我错在哪里?


当你调用yield return ,控制权由Unity采用。

当你启动一个Coroutine Unity会把该方法返回的IEnumerator并在返回的IEnumerator上调用MoveNext。

基于对象的类型和对象中的值,Unity将决定要做什么。

Start方法的情况下, yield语句返回另一个IEnumerator所以Unity不会在Start返回的对象上调用MoveNext ,直到第二个IEnumerator完成。

WaitAndPrint ,第一个MoveNext返回一个WaitForSeconds对象,基于Unity决定它将不会调用MoveNext直到5秒过去。 5秒钟后,它再次调用MoveNext并执行其余的方法,这就是这一行

print ("WaitAndPrint" + Time.time);

由于yield return StartCoroutine (WaitAndPrint ());IEnumerator返回yield return StartCoroutine (WaitAndPrint ()); 达到了它的结尾,它将在由Start返回的IEnumerator上调用MoveNext ,这将继续执行Start

print ("Done " + Time.time);

希望这是清楚的:)


以下是我理解这个结果的方式:

Start()函数由Unity调用一次并打印“Started”。

接下来的行会做两件事:

yield return StartCoroutine (WaitAndPrint ());
  • 它启动WaitAndPrint()协程
  • 在继续执行Start()协程之前,它会等待它结束。
  • WaitAndPrint()协程将完成它的工作:

  • 等待5秒钟
  • 打印“WaitAndPrint”+时间
  • 然后,Start()协程将恢复并打印“完成”+时间。

    这就是为什么

    print ("WaitAndPrint" + Time.time);
    

    之前打印:

    print ("Done " + Time.time);
    

    此外,你应该编辑你的文章,它会错过第一个结果中的空格:

    WaitAndPrint5.010554
    

    应该

    WaitAndPrint 5.010554
    

    对不起,如果它不清楚,这是我第一次回答StackOverflow,希望它有帮助!


    IEnumerators是迭代器块,它们不一定在1帧内执行,当你放置一个yield return ,你基本上是在告诉它遍历多个帧。

    在迭代器方法中达到yield return语句时,将返回expression,并保留代码中的当前位置。

  • https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx
  • 链接地址: http://www.djcxy.com/p/53169.html

    上一篇: How to understand this Unity Coroutine?

    下一篇: Understanding The Execution of Coroutines