Coroutines in series

9

Jak mógłbym zacząć układać serię wywołań Coroutine, które powinny być wykonywane jeden po drugim?

Próbowałem uzyskać efekt migającego koloru, zapętlający serię kolorowych lerpsów w coroutine, ale to nie działa.

Daarwin
źródło

Odpowiedzi:

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

przykład użycia:

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

StartCoroutine(Sequence(PrintCoroutine("foo"), PrintCoroutine("bar")));
Heisenbug
źródło
Ładne rozwiązanie ogólnego zastosowania.
szalony jeż
7

Poza tym, co opisano heisenbug, coś, że instrukcja Unity nie czyni oczywistym jest, że można obiekt, który otrzymasz od rozmowy.yield returnCoroutineStartCoroutine

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

Czasami powoduje to lepszy odczyt niż pętla MoveNext, ale ma tę wadę, że nie można uniemożliwić uruchomienia dziecięcej coroutine za pomocą logiki w najwyższej pętli coroutine, co może być przydatne do konstruowania bardziej wyrafinowanych technik kontroli przepływu na podstawie IEnumerator.

Aby uzyskać więcej informacji na ten temat, zapoznaj się z tym filmem Unite, który obejmuje lepsze wykorzystanie twoich koronek bez budowania własnego harmonogramu koronek.

michael.bartnett
źródło
Zarówno (ta, jak i poniżej) odpowiedzi są świetne. Wolę stosować to podejście, jeśli bardziej zależy Ci na przejrzystości kodu w tradycyjnym OOP. Jeśli jednak wykonujesz programowanie oparte na danych, rozwiązanie @Heisenbug będzie ci lepiej służyć.
IndieForger