<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”。
我哪里错了?
答案 0 :(得分:2)
以下是我对此结果的理解:
Unity启动一次Start()函数并打印“Started”。
然后以下几行做了两件事:
yield return StartCoroutine (WaitAndPrint ());
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方法。尝试使用那个,你的生活会更容易:)