Unity 使用StartCoroutine(IEnumerator)来启动一个协程。参数IEnumerator对象,通常有三种方式获得。
第一种方式,也是最常用方式,是使用带有yield指令的协程函数。
private IEnumerator Start() { yield return null; }
解读一下这个yield return的几种情况:
第二种方式,继承Unity提供的类CustomYieldInstruction,但其实CustomYieldInstruction是实现了IEnumerator。
第三种方式,就是自己实现IEnumerator接口,手动new出一个IEnumerator接口实现类。(后面测试会用到这个类)
// 等待60帧 public class MyWait : IEnumerator { private int frame = 0; // 对应协程运行时,当前上下文的对象。 // 比如指令 yield return object; 返回的值。 public object Current { get { return null; } } // 判定协程是否运行结束 public bool MoveNext() { if (++this.frame < 60) { return true; } else { return false; } } public void Reset() { this.frame = 0; } }
这个IEnumerator代表的是一个Routine,叫做例程。不同Routine之间协同执行,就是Coroutine协程。这个Routine需要能够分布计算,才能够互相协作,不然一路执行到底,就是一般函数了。而IEnumerator接口恰恰承担了这个分布计算的任务。每