协程技术是将一个方法切分到不同帧上执行的技术,但是他和多线程有本质区别,多线程技术是利用CPU物理核心实现同时运行多个方法(程序)的技术,而协程只是让一个方法能够被我们拆分为多个部分,让每个部分在我们规定的时刻执行,看起来就好像同时在执行几个方法一样。简单而言,协程技术就是将方法(函数体)的执行过程拆分到多帧的技术手段。
在unity中我们要使用协程,就要把我们需要将过程按照我们的意愿拆分到多帧的方法写到用IEnumerator修饰的方法当中,这个方法不应该有返回值修饰符。如下。
IEnumerator enumerator()
{
//Do Something in current frame
yield return null;
//Do Something in next frame
}
同时我们还看到,这个协程方法必须要使用yield return来返回某一个值,而yield return与return的区别就在于,方法执行到return之后本次调用方法就彻底完成了,而使用yield return则不会结束这个方法,而是将这个方法挂起,或者说将这个方法冻结到当前状态,从这个yield return跳出当前方法去执行其它的语句,等到下次循环后或者满足某一个条件就会从当前循环的某一个时刻执行yield return之后的语句。
yield return除了可以返回null之外,还有几个选项可以选择,返回null的情况当然是最简单的,当前帧return后,在下一帧就会执行return后的内容。在列举几种常用的return选项,这些return选项关系到何时执行return之后的语句。
IEnumerator enumerator()
{
yield return null;
Debug.Log($"null -> {Time.time}");
yield return new WaitForSeconds(1f);
Debug.Log($"Wait For One Second -> {Time.time}");
//断言为TRUE时执行
yield return new WaitUntil(() => Time.time > 5f);
Debug.Log($"Wait Unitl Time>5 -> {Time.time}");
//断言为FALSE时执行
yield return new WaitWhile(() => Time.time < 7f);
Debug.Log($"Wait While Time<7 -> {Time.time}");
}
上述示例代码中return的选项有WaitForSeconds、WaitUntil、WaitWhile,分别对应,等待几秒后执行、一直等待直到断言为TRUE时执行和当断言为FALSE时开始执行。这几个选项都有很广的应用范围,这里就不再赘述。
当我们写好一个协程方法时我们应该如何调用呢?我们不能像调用普通方法一样直接使用方法名来调用,我们需要使用StartCoroutine方法来调用协程。如下。
StartCoroutine(enumerator());
当我们在unity editor中运行这段代码时我们得到了以下结果。
更多关于StartCoroutine的信息请参考官方文档MonoBehaviour.StartCoroutine。当然除了开始一个协程之外,我们还可以停止一个协程,而停止协程的方法就是StopCoroutine,参数同样是需要停止的协程的名称。
我们示例当中的协程没有任何的参数,但协程肯定是允许传参的,这跟普通方法的参数没有什么区别就不再详细说明了,但是要记住在使用StartCoroutine的时候要记住将协程的参数写完整。
最后,协程还有很多的高阶段的操作,比如自定义yield return的内容(keepwaiting),协程之间的嵌套等等,这里就不再赘述,有需要的时候再自行查阅。
标签:return,Coroutine,yield,Unity,Time,协程,执行,方法 From: https://www.cnblogs.com/HalfDog/p/18013431