做Unity项目用协程用了段时间,在完全黑盒的情况下摸索出了一些协程的性质。写篇文记录一下。

  1. 要启动一个协程,需要调用StartCoroutine()函数,这个函数只有一个参数,类型为IEnumerator。即以一个迭代器为参数。
  2. 直接将容器的迭代器传给StartCoroutine()暂时没有认识到有什么用处。
  3. Unity的协程主要利用的是C#的一个语法糖:返回值为IEnumerator的函数会直接返回一个迭代器。每一次调用迭代器的MoveNext方法时,函数只会执行到遇到的第一个yield return处,并在下一次调用MoveNext的时候从这个yield return开始执行,直到往后碰到yield return或者到函数结束再跳出函数。
  4. yield return可以返回null,也可以返回一个协程。返回null时会在下一帧中直接再次进入协程函数;返回协程时会等待这个协程执行完毕再继续执行。因此可以把小的协程连成一个大协程,让一些动画效果顺序执行:
IEnumerator Combine()
{
	yield return Anim1();
	yield return Anim2();
	yield return Anim3();
	// ...
	yield return AnimN();
}
  1. 因此根据上述描述,我们可以把Update函数放到一个协程中,其运行规律和MonoBehavior的Update应该是一致的:
void Start()
{
	StartCoroutine(UpdateRunner());
}

IEnumerator UpdateRunner()
{
	while (true)
	{
		MyUpdate();
		yield return null;
	}
}

void MyUpdate()
{
}
  1. 协程的本质是状态机的语法糖,所以协程并非必需。但是妥善运用好协程可以减少代码量。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐