Réponses:
public static IEnumerator Sequence(params IEnumerator[] sequence)
{
for(int i = 0 ; i < sequence.Length; ++i)
{
while(sequence[i].MoveNext())
yield return sequence[i].Current;
}
}
exemple d'utilisation:
IEnumerator PrintCoroutine(string arg)
{
yield return new WaitForSeconds(0.3f);
}
StartCoroutine(Sequence(PrintCoroutine("foo"), PrintCoroutine("bar")));
En plus de ce que Heisenbug a décrit, quelque chose que le manuel Unity ne rend pas évident, c'est que vous pouvez yield return
un Coroutine
objet, que vous recevez d'un StartCoroutine
appel.
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);
}
Cela permet parfois une meilleure lecture qu'une boucle MoveNext, mais présente l'inconvénient que vous ne pouvez pas empêcher la coroutine enfant de s'exécuter via la logique dans la boucle de coroutine la plus haute, ce qui pourrait être utile pour construire des techniques de contrôle de flux plus sophistiquées au-dessus de IEnumerator.
Pour en savoir plus, vous devriez regarder cette vidéo Unite qui explique comment tirer le meilleur parti de vos coroutines sans créer votre propre planificateur de coroutines.