Розслідування в серії


9

Як би я міг займатися складанням серії викликів Coroutine, які слід виконувати один за одним?

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

Відповіді:


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

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

Більше про це, вам слід переглянути це відео Unite, яке висвітлює можливість отримання більше результатів, не будуючи власного планувальника програм.


Обидва (це та нижче) визнання чудові. Я б пішов з таким підходом, якщо ви більше піклуєтеся про прозорість коду в традиційному OOP. Якщо ви все-таки робите розробку, керовану даними, рішення @Heisenbug послужить вам краще.
IndieForger
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.