2014-01-08 69 views
1

我使用的是Unity3D的StartCoroutine方法,我有一個關於嵌套協程的問題。使用IEnumerator與Unity3d IEnumerable嵌套協程

通常情況下,嵌套的協同程序可能是這個樣子:

void Start() { StartCoroutine(OuterCoroutine()); } 

IEnumerator OuterCoroutine() 
{ 
    //Do Some Stuff . . . 
    yield return StartCoroutine(InnerCoroutine()); 
    //Finish Doing Stuff . . . 
} 

IEnumerator InnerCoroutine() 
{ 
    //Do some other stuff . . . 
    yield return new WaitForSeconds(2f); 
    //Finish Doing that other stuff . . . 
} 

這一切很好,很好,但它真的沒有必要。相同的效果,可以實現這樣的:

void Start() { StartCoroutine(OuterCoroutine()); } 

IEnumerator OuterCoroutine() 
{ 
    //Do Some Stuff . . . 
    IEnumerator innerCoroutineEnumerator = InnerCoroutine().GetEnumerator(); 
    while(innerCoroutineEnumerator.MoveNext()) 
     yield return innerCoroutineEnumerator.Current; 
    //Finish Doing Stuff . . . 
} 

IEnumerable InnerCoroutine() 
{ 
    //Do some other stuff . . . 
    yield return new WaitForSeconds(2f); 
    //Finish Doing that other stuff . . . 
} 

我發現這個方法產生較少的垃圾(其可以是在統一的一個問題),比具有多個StartCoroutines;因此它非常有用,特別是在處理很多嵌套圖層時。

現在我的問題是:

而不是使用IEnumerable InnerCoroutine(){}並獲得像這樣的枚舉:

IEnumerator innerCoroutineEnumerator = InnerCoroutine().GetEnumerator(); 

我想使用IEnumerator InnerCoroutine(){},並得到這樣的枚舉:

IEnumerator innerCoroutineEnumerator = InnerCoroutine(); 

它們是一樣的嗎?

除了在我的測試中更快,此方法將允許我通過正常的StartCoroutine方法使用「內部協同程序」方法,這在方法上可能有用。

我已經完成了測試,並且據我所知,這兩種技術都有效地做了同樣的事情,但我在整個編碼方面還是比較新的,所以有機會我錯過了一些東西。

回答

0

事實上,兩種書寫方式都會產生相同的結果。

這更多的是C#的問題,Unity3D只是在他們的協同系統中使用這些類型。你可能會發現this post answering in more details你的問題。

但是,我不知道你所說

指的是我發現這種方法產生更少的垃圾(可在統一的問題)

因爲這兩種方法應該產生相同的結果。在這一點上,它更多地是代碼風格的選擇。

我個人更喜歡StartCoroutine(InnerCoroutine())單行,其中InnerCoroutine()會返回IEnumerator。我沒有看到在返回一個IEnumerable爲InnerCoroutine(),然後獲得它的枚舉器。

+1

如果您打算手動遍歷枚舉數據塊的內容,那麼返回IEnumerable會很方便,但是再一次,它只是語法糖,因爲您可以使用一個while(iterator.MoveNext())實現與IEnumerator相同的結果{ }循環。一個不同之處在於,在使用foreach時,Dispose將確保在IEnumerable上爲您自動調用,而IEnumerator不具有相同的好處。目前尚不清楚何時或如何變得有用。 –