最简单的 Unity 协程剖析
协程一般写法:
void start()
{
StartCoroutine(do());
}
IEnumerator do(){
FooA();
yield return new WaitForSeconds(3f);
FooB();
}
C#编译器首先把我们的do()方法编译成一个迭代器的类,StartCoroutine()方法其实就是把这个迭代器的对象添加到MonoBehaviour的协程列表里。每一帧都会去执行这个列表里每一个迭代器的MoveNext()方法,上面代码编译出的迭代器类的MoveNext()伪代码如下:
bool MoveNext(){
switch (状态){
case 0:
状态 = 1;
FooA();
return true;
label:
FooB();
return false; //结束迭代
case 1:
if(是否等了3s){
状态 = 0;
goto label;
}else{
return true;
}
}
}