Coroutinen in Serie

9

Wie würde ich vorgehen, um eine Reihe von Coroutine-Aufrufen zu stapeln, die nacheinander ausgeführt werden sollten?

Ich habe versucht, einen blinkenden Farbeffekt zu erzielen, der eine Reihe von Farblerps in einer Coroutine wiederholt, aber es funktioniert nicht.

Daarwin
quelle

Antworten:

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

Anwendungsbeispiel:

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

StartCoroutine(Sequence(PrintCoroutine("foo"), PrintCoroutine("bar")));
Heisenbug
quelle
Schöne Allzwecklösung.
wahnsinniger Igel
7

Zusätzlich zu dem, was Heisenbug beschrieben hat, macht das Unity-Handbuch nicht deutlich, dass Sie yield returnein CoroutineObjekt verwenden können, das Sie von einem StartCoroutineAnruf erhalten.

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

Dies führt manchmal zu einem besseren Lesen als eine MoveNext-Schleife, hat jedoch den Nachteil, dass Sie nicht verhindern können, dass die untergeordnete Coroutine über Logik in der obersten Coroutine-Schleife ausgeführt wird. Dies kann hilfreich sein, um komplexere Flusssteuerungstechniken auf IEnumerator aufzubauen.

Weitere Informationen hierzu finden Sie in diesem Unite-Video, in dem es darum geht, mehr aus Ihren Coroutinen herauszuholen, ohne einen eigenen Coroutine-Scheduler zu erstellen.

michael.bartnett
quelle
Beide (dies und unten) Antworten sind großartig. Ich würde diesen Ansatz wählen, wenn Sie mehr Wert auf Codetransparenz in der traditionellen OOP legen. Wenn Sie jedoch eine datengesteuerte Entwicklung durchführen, wird Ihnen die @ Heisenbug-Lösung bessere Dienste leisten.
IndieForger