协程系列


9

我将如何堆叠一系列应该一个接一个执行的Coroutine调用?

我试图获得闪烁的色彩效果,在协程中循环显示一系列色差,但无法正常工作。

Answers:


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

除了什么Heisenbug描述的东西,统一手册没有做出明显的是,你可以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视频该视频介绍了在不构建自己的协程调度程序的情况下从协程中获得更多收益的方法。


(这个和下面的)请求都很棒。如果您更关心传统OOP中的代码透明性,我将采用这种方法。但是,如果您进行数据驱动的开发,则@Heisenbug解决方案将为您提供更好的服务。
IndieForger
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.