2013-03-12 61 views
5

我的代碼的要點遇到問題如下:重構一個IEnumerator方法多產量

// Play the first beat 
audio.PlayOneShot(beat); 

// Show 1st heartbeat border flash 
TweenAlpha.Begin(heartbeatPanel.gameObject, 0.1f, currentStress); 
yield return new WaitForSeconds(0.1f); 
TweenAlpha.Begin(heartbeatPanel.gameObject, 0.5f, 0); 

yield return new WaitForSeconds(interval); 

// Play the second beat 
audio.PlayOneShot(beat); 

// Show 2nd heartbeat border flash 
TweenAlpha.Begin(heartbeatPanel.gameObject, 0.1f, currentStress); 
yield return new WaitForSeconds(0.1f); 
TweenAlpha.Begin(heartbeatPanel.gameObject, 0.5f, 0); 

yield return new WaitForSeconds(interval * 2); 

現在我想上面的代碼有2個呼叫分成單個的IEnumerator方法。

這是我想出了:

StartCoroutine(PlayBeat(currentStress, interval)); 
StartCoroutine(PlayBeat(currentStress, interval * 2)); 

// ... 

IEnumerator PlayBeat(float currentStress, float interval) 
{ 
    audio.PlayOneShot(beat); 

    TweenAlpha.Begin(heartbeatPanel.gameObject, 0.1f, currentStress); 
    yield return new WaitForSeconds(0.1f); 
    TweenAlpha.Begin(heartbeatPanel.gameObject, 0.5f, 0); 

    yield return new WaitForSeconds(interval); 
} 

的問題,這是不是在拍他們正確的時間間隔發聲,兩者節拍響起在同一時間,因爲我有這些電話一個無限循環,Unity因爲沒有考慮間隔而崩潰。

將上述兩個重複的代碼塊提取到單個IEnumerator方法中的最佳方式是什麼?

+0

你目前的代碼看起來很好(至少,沒有看到'StartCoroutine') - 問題是什麼? – 2013-03-12 08:56:29

+1

在描述問題時,您能否比「不起作用」更具體? – ChrisF 2013-03-12 08:57:25

+0

我說得對,你一次聽到兩個節拍? – Kay 2013-03-12 08:59:06

回答

6

Unity3d的協同程序可以嵌套。要等待嵌套協程,您需要將其放棄。所以你的功能PlayBeat是好的;你只需要以unity3d理解的意思是「等到完成」來啓動它。你的例子會看起來如下:

yield return StartCoroutine(PlayBeat(currentStress, interval)); 
yield return StartCoroutine(PlayBeat(currentStress, interval * 2)); 

它看起來很像C#5的異步/等待。在某種程度上,這並不令人驚訝,因爲它們都是編譯器轉換的「協同」狀態機 - 但它仍然很整齊,可以看到相似性。

+0

+1只是試了一下,它的工作完美無瑕。 – 2013-03-13 18:48:32