[英]How to understand this Unity Coroutine?
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()的返回值是空的。 在我看來,Start()僅由Unity執行一次(一幀),但是收益回報似乎使Start()函數在兩幀中執行;
其次,我也對結果感到困惑。 我認為結果應該是
Starting 0
Done 5.010554
WaitAndPrint 5.010554
因為StartCoroutine()啟動函數WaitAndPrint()。 在WaitAndPrint()函數中, yield return使此函數在此幀中暫停並返回Start()。 然后Start()繼續進行,並顯示“ Done xxxxx”。 5秒后,WaitAndPrint()恢復並打印“ WaitAndPrint xxxxx”。
我哪里錯了?
這是我對這個結果的理解:
Start()函數由Unity調用一次,並顯示“已啟動”。
然后,以下代碼行做了兩件事:
yield return StartCoroutine (WaitAndPrint ());
WaitAndPrint()協程將完成其工作:
然后,Start()協程將恢復並顯示“完成” +時間。
這就是為什么
print ("WaitAndPrint" + Time.time);
在之前打印:
print ("Done " + Time.time);
另外,您應該編輯您的帖子,它在第一個結果中會丟失空格:
WaitAndPrint5.010554
應該
WaitAndPrint 5.010554
抱歉,如果不清楚,這是我第一次在StackOverflow上回答,希望對您有所幫助!
當您調用yield return
,控件將由Unity控制。
當您啟動一個Coroutine
Unity將采用該方法返回的IEnumerator
,並在返回的IEnumerator
上調用MoveNext 。
根據對象的類型和對象中的值,Unity將決定要做什么。
在Start
方法中, yield
語句返回另一個IEnumerator
因此Unity不會在第二個IEnumerator
完成之前在Start
返回的對象上調用MoveNext
。
在WaitAndPrint
,第一個MoveNext
返回一個WaitForSeconds
對象,基於Unity決定,直到經過5秒鍾,它才調用MoveNext
。 5秒后,它再次調用MoveNext
,然后執行該方法的其余部分,即此行
print ("WaitAndPrint" + Time.time);
作為由yield return StartCoroutine (WaitAndPrint ());
的IEnumerator
返回yield return StartCoroutine (WaitAndPrint ());
到達其末尾時,它將在Start
返回的IEnumerator
上調用MoveNext
,這將執行Start
剩下的內容:
print ("Done " + Time.time);
希望這足夠清楚:)
IEnumerators
是迭代器塊,它們不一定要執行1幀,當您放置yield return
,您實際上是在告訴它迭代多個幀。
在迭代器方法中到達yield return語句時,將返回expression,並保留代碼中的當前位置。
代替IEnumerators,您可以“幾乎”始終使用Invoke方法。 嘗試與那個人一起工作,您的生活會更輕松:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.