Corutinas en serie

9

¿Cómo haría para apilar una serie de llamadas de rutina que deberían ejecutarse una tras otra?

He intentado obtener un efecto de color parpadeante que repite una serie de lerps de color en una rutina pero no funciona.

Daarwin
fuente

Respuestas:

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

ejemplo de uso:

IEnumerator PrintCoroutine(string arg)
{
  yield return new WaitForSeconds(0.3f);
}

StartCoroutine(Sequence(PrintCoroutine("foo"), PrintCoroutine("bar")));
Heisenbug
fuente
Buena solución de uso general.
erizo demente
7

Además de lo que describió Heisenbug, algo que el manual de Unity no hace obvio es que puedes hacer yield returnun Coroutineobjeto que recibes de una StartCoroutinellamada.

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.

michael.bartnett
fuente
Ambas respuestas (esto y abajo) son geniales. Seguiría este enfoque si te importa más la transparencia del código en la OOP tradicional. Sin embargo, si está haciendo un desarrollo basado en datos, la solución @Heisenbug le servirá mejor.
IndieForger