Coroutines en série

9

Comment pourrais-je empiler une série d'appels Coroutine qui devraient être exécutés l'un après l'autre?

J'ai essayé d'obtenir un effet de couleur clignotant en boucle sur une série de lerps de couleur dans une coroutine, mais cela ne fonctionne pas.

Daarwin
la source

Réponses:

7
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")));
Heisenbug
la source
Belle solution à usage général.
hérisson dément
7

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 returnun Coroutineobjet, que vous recevez d'un StartCoroutineappel.

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.

michael.bartnett
la source
Les réponses (ci-dessous et ci-dessous) sont excellentes. J'adopterais cette approche si vous vous souciez davantage de la transparence du code dans la POO traditionnelle. Cependant, si vous faites du développement basé sur les données, la solution @Heisenbug vous servira mieux.
IndieForger