2015-07-02 27 views
1
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); 
    } 
} 

結果是如何理解這個Unity協程?

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()中,收益率返回使此函數在此幀中暫停並返回到Start()。然後開始()繼續並打印「完成xxxxx」。 5秒鐘後,WaitAndPrint()恢復並打印「WaitAndPrint xxxxx」。

我在哪裏錯了?

回答

2

當您撥打yield return時,控制權由Unity拍攝。

當您啓動Coroutine統一將採取該方法返回的IEnumerator並呼籲返回IEnumeratorMoveNext

根據對象的類型和對象中的值,Unity將決定如何操作。

在您在Start方法情況下,yield語句返回另一個IEnumerator所以統一也不會調用Start返回的對象MoveNext直到第二IEnumerator結束。

WaitAndPrint第一MoveNext返回WaitForSeconds對象,基於該統一決定將此事在不通話MoveNext直到5秒已經過去了。 5秒鐘後再次調用MoveNext和執行方法的休息,這就是此行

print ("WaitAndPrint" + Time.time); 

由於返回由yield return StartCoroutine (WaitAndPrint());走到了盡頭,它會調用MoveNext上被Start返回IEnumeratorIEnumerator,這反過來將執行什麼都留下的Start

print ("Done " + Time.time); 

希望這是很清楚:)

+0

基於對象的類型和對象的值Unity將決定做什麼。 這就是要點! – mingchaoyan

2

這就是我所理解這樣的結果:

開始()函數是由Unity和打印調用一次 「已啓動」。

然後下面一行做了兩兩件事:

yield return StartCoroutine (WaitAndPrint()); 
  • 它開始WaitAndPrint()協同程序
  • 等待它繼續在start()協同程序之前結束。

的WaitAndPrint()協同程序將盡自己的東西:

  • 等待5秒鐘
  • 打印 「WaitAndPrint」 +時間

然後開始()協同程序將繼續工作,打印「完成」+時間。

這就是爲什麼

print ("WaitAndPrint" + Time.time); 

前印:

print ("Done " + Time.time); 

此外,您應該編輯您的文章,它錯過在第一結果的空間:

WaitAndPrint5.010554 

應該be

WaitAndPrint 5.010554 

對不起,如果它不清楚,這是我第一次在StackOverflow上回答,希望它有幫助!

0

而不是IEnumerators你可以「幾乎」總是使用調用方法。嘗試與那個一起工作,你的生活會更容易:)