Câu trả lời:
public static IEnumerator Sequence(params IEnumerator[] sequence)
{
for(int i = 0 ; i < sequence.Length; ++i)
{
while(sequence[i].MoveNext())
yield return sequence[i].Current;
}
}
ví dụ sử dụng:
IEnumerator PrintCoroutine(string arg)
{
yield return new WaitForSeconds(0.3f);
}
StartCoroutine(Sequence(PrintCoroutine("foo"), PrintCoroutine("bar")));
Ngoài những gì Heisenorms đã mô tả, một điều mà hướng dẫn sử dụng Unity không thể hiện rõ là bạn có thể yield return
là một Coroutine
đối tượng mà bạn nhận được từ một StartCoroutine
cuộc gọi.
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);
}
Điều này đôi khi giúp đọc tốt hơn vòng lặp MoveNext, nhưng có nhược điểm là bạn không thể ngăn coroutine con chạy qua logic trong vòng lặp coroutine trên cùng, có thể hữu ích cho việc xây dựng các kỹ thuật kiểm soát dòng tinh vi hơn trên IEnumerator.
Để biết thêm về điều này, bạn nên xem video Unite này bao gồm việc khai thác nhiều hơn từ các coroutines của bạn mà không cần xây dựng lịch trình coroutine của riêng bạn.