Risposte:
public static IEnumerator Sequence(params IEnumerator[] sequence)
{
for(int i = 0 ; i < sequence.Length; ++i)
{
while(sequence[i].MoveNext())
yield return sequence[i].Current;
}
}
esempio di utilizzo:
IEnumerator PrintCoroutine(string arg)
{
yield return new WaitForSeconds(0.3f);
}
StartCoroutine(Sequence(PrintCoroutine("foo"), PrintCoroutine("bar")));
Oltre a quanto descritto da Heisenbug, qualcosa che il manuale Unity non rende ovvio è che puoi ottenere yield return
un Coroutine
oggetto che ricevi da una StartCoroutine
chiamata.
public IEnumerator RunColorCoroutineLoop()
{
while (true) {
yield return StartCoroutine(FirstColorCoroutine());
yield return StartCoroutine(SecondColorCoroutine());
yield return StartCoroutine(ThirdColorCoroutine());
yield return StartCoroutine(FourthColorCoroutine());
}
}
public IEnumerator FirstColorCoroutine()
{
SetColor("color1");
yield return new WaitForSeconds(1f);
}
public IEnumerator SecondColorCoroutine()
{
SetColor("color2");
yield return new WaitForSeconds(1f);
}
public IEnumerator ThirdColorCoroutine()
{
SetColor("color3");
yield return new WaitForSeconds(1f);
}
public IEnumerator FourthColorCoroutine()
{
SetColor("color4");
yield return new WaitForSeconds(1f);
}
Questo a volte rende la lettura migliore rispetto a un ciclo MoveNext, ma presenta lo svantaggio di non poter impedire l'esecuzione della coroutine figlio tramite la logica all'interno del ciclo coroutine più in alto, che potrebbe essere utile per costruire tecniche di controllo del flusso più sofisticate su IEnumerator.
Per ulteriori informazioni, dovresti guardare questo video Unite che illustra come ottenere di più dalle tue coroutine senza creare il tuo programma di pianificazione delle coroutine.