如何理解Unity Coroutine?

时间:2015-07-02 14:59:19

标签: c# unity3d coroutine

<script src="scripts/jquery-2.1.N.js"></script>

//In my case
<script src="scripts/jquery-2.1.4.js"></script>

结果是

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);
    }
}

我有两个问题?

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

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

Starting 0
WaitAndPrint 5.010554
Done 5.010554

因为StartCoroutine()启动了WaitAndPrint()函数。在函数WaitAndPrint()中, yield return 使此函数在此帧中暂停并返回到Start()。然后Start()继续进行并打印“Done xxxxx”。 5秒后,WaitAndPrint()恢复和 打印“WaitAndPrint xxxxx”。

我哪里错了?

4 个答案:

答案 0 :(得分:2)

以下是我对此结果的理解:

Unity启动一次Start()函数并打印“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,希望它有所帮助!

答案 1 :(得分:2)

当您致电yield return时,Unity将采取控制措施。

当你开始Coroutine时,Unity会接受该方法返回的IEnumerator,并会在IEnumerator返回时致电MoveNext

根据对象的类型和对象中的值,Unity将决定做什么。

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

WaitAndPrint中,第一个MoveNext会返回一个WaitForSeconds对象,根据该明确定它将调用MoveNext。 5秒钟过去了。 5秒后,它再次调用MoveNext并执行方法的其余部分,这就是这一行

print ("WaitAndPrint" + Time.time);

IEnumerator返回的yield return StartCoroutine (WaitAndPrint ());到达终点时,它会在MoveNext返回的IEnumerator上调用Start,这将依次执行剩下的Start

print ("Done " + Time.time);

希望这很清楚:)

答案 2 :(得分:0)

IEnumerators是迭代器块,它们不一定执行1帧,当你放置yield return时,你实际上是在告诉它迭代多个帧。

  

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

答案 3 :(得分:0)

而不是IEnumerator,你可以&#34;几乎&#34;总是使用Invoke方法。尝试使用那个,你的生活会更容易:)