Corotinas em série

9

Como eu empilharia uma série de chamadas da Coroutine que deveriam ser executadas uma após a outra?

Tentei obter um efeito de cor intermitente, repetindo uma série de leituras de cores em uma rotina, mas não está funcionando.

Daarwin
fonte

Respostas:

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

exemplo de uso:

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

StartCoroutine(Sequence(PrintCoroutine("foo"), PrintCoroutine("bar")));
Heisenbug
fonte
Solução agradável de uso geral.
ouriço demente
7

Além do que Heisenbug descreveu, algo que o manual do Unity não torna óbvio é que você pode yield returnum Coroutineobjeto que você recebe de uma StartCoroutinechamada.

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

Às vezes, isso resulta em uma leitura melhor do que um loop MoveNext, mas tem a desvantagem de que você não pode impedir a execução da lógica de uma criança na lógica dentro do loop mais alto, o que pode ser útil para a construção de técnicas de controle de fluxo mais sofisticadas sobre o IEnumerator.

Para saber mais, consulte este vídeo do Unite, que cobre o aproveitamento máximo de suas corotinas sem criar seu próprio agendador de cores.

michael.bartnett
fonte
Ambos (isto e abaixo) as respostas são ótimas. Eu seguirei essa abordagem se você se importa mais com a transparência do código no OOP tradicional. Se, no entanto, você estiver desenvolvendo uma solução @Heisenbug de desenvolvimento orientado a dados, será mais útil.
IndieForger 20/05