Ответы:
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")));
В дополнение к тому, что описал Гейзенбаг, руководство 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, в котором рассказывается о том, как получить больше от своих сопрограмм без создания собственного планировщика сопрограмм.