协程的本质
协程可以分成两个部分:协程函数本体(迭代器函数),协程调度器。
协程本体就是一个能够在中间暂停返回的函数。达到分步的效果。
协程调度器是Unity内部实现的,会在对应的时机帮助我们继续执行协程函数。达到分时的效果。
协程本体是迭代器方法的体现
public class Test : MonoBehaviour
{
private void Start()
{
//1.协程本体函数
//如果我们不通过Unity提供的方法开启协程函数
//Unity的协程调度器是不会帮我们管理协程函数的
IEnumerator ie = Test1();
//但是我们可以自己执行协程函数内容
//MoveNext会执行到 yield return 为止
//并将yield return的结果赋值给Current
//另外MoveNext会有一个bool类型的返回值,表示这个协程是否执行完毕
ie.MoveNext();
print(ie.Current);//1
ie.MoveNext();
print(ie.Current);//2
}
IEnumerator Test1()
{
//第一步
print(1);
yield return 1;
//第二步
print(2);
yield return 2;
}
}
协程调度器
继承自MonoBehaviour后开启协程。相当于把一个协程函数(迭代器)放入到Unity的协程调度器中帮助我们管理进行执行,具体的yield return后面的规则也是Unity定义的一些规则。除了可以直接返回数字,null之外,剩下的需要new的对象(比如:WaitForEndOfFrame,WaitForSeconds等)都是YieldInstruction的子类。
简单的理解迭代器函数:C#看到迭代器函数和yield return语法糖,就会把原本是一个的函数变成“几部分”,我们就可以通过迭代器从上到下遍历这“几部分”进行执行,达到了将一个函数中的逻辑分时执行的目的。
而协程调度器就是利用迭代器函数返回的内容来进行之后的处理。比如Unity中的协程调度器根据yield return返回的内容,决定下一次在何时继续执行迭代器的“下一部分”。
总结
协程的本质就是利用C#的迭代器函数“分步执行”的特点,加上协程调度器的逻辑,实现的一套分时执行函数的规则!