Сопрограммы в сериале

9

Как бы я мог составить последовательность вызовов Coroutine, которые должны выполняться один за другим?

Я пытался получить мигающий цветовой эффект, зацикливая серию цветовых эффектов в сопрограмме, но это не работает.

Daarwin
источник

Ответы:

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

пример использования:

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

StartCoroutine(Sequence(PrintCoroutine("foo"), PrintCoroutine("bar")));
гейзенбаг
источник
Хорошее решение общего назначения.
сумасшедший ежик
7

В дополнение к тому, что описал Гейзенбаг, руководство Unity не делает очевидным то, что вы можете yield returnполучить Coroutineобъект, который вы получите от StartCoroutineвызова.

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

Это иногда делает чтение лучше, чем цикл MoveNext, но имеет недостаток, заключающийся в том, что вы не можете предотвратить выполнение дочерней сопрограммы с помощью логики в самом верхнем цикле сопрограммы, что может быть полезно для создания более сложных методов управления потоком поверх IEnumerator.

Более подробно об этом вы можете посмотреть в этом видео Unite, в котором рассказывается о том, как получить больше от своих сопрограмм без создания собственного планировщика сопрограмм.

michael.bartnett
источник
Оба (это и ниже) ответы великолепны. Я согласен с этим подходом, если вы больше заботитесь о прозрачности кода в традиционных ООП. Однако если вы занимаетесь разработкой на основе данных, решение @Heisenbug будет вам лучше.
IndieForger