本文需要有一定的C#迭代器基础知识和unity的协程相关的基础知识,如果对这两者不太了解,可以先看下笔者之前的文章:c# yield关键字解析、Unity协程(一):彻底了解yield return null 和 yield return new WaitForSeconds。
好的,话不多说,我们直接开始吧:为了方便理解和标识,本例子的类采取My + unity的类名的命名方式。首先我们新建一个名叫MyCoroutine的Visual C#控制台应用程序,新建两个类:
public class MyYieldInstruction
{
}
public class MyWaitForSeconds : MyYieldInstruction
{
public float seconds;
public MyWaitForSeconds(float seconds)
{
this.seconds = seconds;
}
}
分别对应unity中的YieldInstruction和WaitForSeconds。之所以要有MyYieldInstruction这个空类,是为了在保存数据的时候直接使用基类指针,这样方便。当然我们这次其他的例如WaitForEndOfFrame、WaitForFixedUpdate之类的就不实现了,因为原理都是一样的。
第二步我们应该还有个类似于Unity的MonoBehaviour的类,用来写我们的StartCoroutine接口并对迭代器数据进行保存和驱动(其实有个管理类更好,简单起见就写在一起了):MyMonoBehaviour。思考一下,因为我们要保存迭代器的指针,所以我们的协程容器里面必定要有一个IEnumerator,有了IEnumerator我们还得知道它是什么类型的指令,比如是WairForSeconds还是直接yield return null,所以还得保存MyYieldInstruction这个基类指针(为null表示非MyYieldInstru