Respuestas:
public static IEnumerator Sequence(params IEnumerator[] sequence)
{
for(int i = 0 ; i < sequence.Length; ++i)
{
while(sequence[i].MoveNext())
yield return sequence[i].Current;
}
}
ejemplo de uso:
IEnumerator PrintCoroutine(string arg)
{
yield return new WaitForSeconds(0.3f);
}
StartCoroutine(Sequence(PrintCoroutine("foo"), PrintCoroutine("bar")));
Además de lo que describió Heisenbug, algo que el manual de Unity no hace obvio es que puedes hacer yield return
un Coroutine
objeto que recibes de una StartCoroutine
llamada.
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);
}
Esto a veces hace una mejor lectura que un bucle MoveNext, pero tiene la desventaja de que no puede evitar que la rutina infantil se ejecute a través de la lógica dentro del bucle corutina superior, lo que podría ser útil para construir técnicas de control de flujo más sofisticadas sobre IEnumerator.
Para obtener más información sobre esto, debe mirar este video de Unite que cubre cómo sacar más provecho de sus rutinas sin crear su propio programador de rutinas.