Unity协程(Coroutine)实践笔记
文章目录做Unity项目用协程用了段时间,在完全黑盒的情况下摸索出了一些协程的性质。写篇文记录一下。要启动一个协程,需要调用StartCoroutine()函数,这个函数只有一个参数,类型为IEnumerator。即以一个迭代器为参数。直接将容器的迭代器传给StartCoroutine()暂时没有发觉有什么用处,这个协程主要利用的是C#的一个语法糖:返回IEnumerator的函数会从yield
·
做Unity项目用协程用了段时间,在完全黑盒的情况下摸索出了一些协程的性质。写篇文记录一下。
- 要启动一个协程,需要调用
StartCoroutine()
函数,这个函数只有一个参数,类型为IEnumerator
。即以一个迭代器为参数。 - 直接将容器的迭代器传给
StartCoroutine()
暂时没有认识到有什么用处。 - Unity的协程主要利用的是C#的一个语法糖:返回值为
IEnumerator
的函数会直接返回一个迭代器。每一次调用迭代器的MoveNext
方法时,函数只会执行到遇到的第一个yield return
处,并在下一次调用MoveNext
的时候从这个yield return
开始执行,直到往后碰到yield return
或者到函数结束再跳出函数。 yield return
可以返回null
,也可以返回一个协程。返回null
时会在下一帧中直接再次进入协程函数;返回协程时会等待这个协程执行完毕再继续执行。因此可以把小的协程连成一个大协程,让一些动画效果顺序执行:
IEnumerator Combine()
{
yield return Anim1();
yield return Anim2();
yield return Anim3();
// ...
yield return AnimN();
}
- 因此根据上述描述,我们可以把Update函数放到一个协程中,其运行规律和MonoBehavior的Update应该是一致的:
void Start()
{
StartCoroutine(UpdateRunner());
}
IEnumerator UpdateRunner()
{
while (true)
{
MyUpdate();
yield return null;
}
}
void MyUpdate()
{
}
- 协程的本质是状态机的语法糖,所以协程并非必需。但是妥善运用好协程可以减少代码量。
更多推荐
已为社区贡献1条内容
所有评论(0)