Coroutine in serie


9

Come potrei fare per impilare una serie di chiamate Coroutine che dovrebbero essere eseguite una dopo l'altra?

Ho provato a ottenere un effetto di colore lampeggiante eseguendo il ciclo di una serie di colori in sequenza, ma non funziona.

Risposte:


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

esempio di utilizzo:

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

StartCoroutine(Sequence(PrintCoroutine("foo"), PrintCoroutine("bar")));

Bella soluzione per tutti gli usi.
Demented Hedgehog,

7

Oltre a quanto descritto da Heisenbug, qualcosa che il manuale Unity non rende ovvio è che puoi ottenere yield returnun Coroutineoggetto che ricevi da una StartCoroutinechiamata.

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

Questo a volte rende la lettura migliore rispetto a un ciclo MoveNext, ma presenta lo svantaggio di non poter impedire l'esecuzione della coroutine figlio tramite la logica all'interno del ciclo coroutine più in alto, che potrebbe essere utile per costruire tecniche di controllo del flusso più sofisticate su IEnumerator.

Per ulteriori informazioni, dovresti guardare questo video Unite che illustra come ottenere di più dalle tue coroutine senza creare il tuo programma di pianificazione delle coroutine.


Entrambi (questo e sotto) le risposte sono fantastici. Seguirò questo approccio se ti interessa di più la trasparenza del codice nell'OOP tradizionale. Se invece fai uno sviluppo basato sui dati, la soluzione @Heisenbug ti servirà meglio.
IndieForger,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.