2013-03-12 25 views
5

Der Kern meiner Code Refactoring ist wie folgt:Probleme ein IEnumerator Verfahren mit mehreren Ausbeuten

// 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); 

Jetzt habe ich den obigen Code in einem einzigen IEnumerator Methode mit 2 Anrufe geteilt werden soll.

Das ist, was ich kam mit:

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); 
} 

Das Problem dabei, dass die Beats klingen mit ihrem richtigen Intervall statt heißt, beide Schläge am gleichzeitig klang und weil ich diese Anrufe in In einer Endlosschleife ist Unity abgestürzt, weil die Intervalle nicht berücksichtigt werden.

Was ist der beste Weg, um meine beiden sich wiederholenden Code-Blöcke oben in eine einzige IEnumerator-Methode zu extrahieren?

+0

Ihr aktueller Code sieht gut aus (zumindest, ohne 'StartCoroutine' zu ​​sehen) - was ist das Problem? –

+1

Können Sie bitte genauer sein als "es funktioniert nicht", wenn Sie das Problem beschreiben. – ChrisF

+0

Habe ich Recht, dass Sie die zwei Schläge auf einmal hören? – Kay

Antwort

6

Die Coroutinen von Unity3d können verschachtelt werden. Um auf eine verschachtelte Coroutine zu warten, müssen Sie sie liefern. So ist Ihre Funktion PlayBeat in Ordnung; Sie müssen es nur so starten, dass unity3d "warten bis vollständig" bedeutet. Ihr Beispiel würde dann wie folgt aussehen:

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

Es ist unheimlich, wie ähnlich die C# 5 von Asynchron sieht/erwarten. Auf einer gewissen Ebene ist dies nicht überraschend, da beide kompiliertransformierte "Coroutine" -Zustandsmaschinen sind - aber es ist immer noch schön, die Ähnlichkeit zu sehen.

+0

+1 Habe es einfach ausprobiert und es funktioniert einwandfrei. –