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.

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

Ł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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.