Unity协程的理解

理解:

在Unity中协程就是一种方法,一种可以暂停执行把控制权交给Unity,但是下一帧会继续执行的一个方法。暂停是关键点,就是暂停当前的执行,但是不影响主线程的继续执行,当满足条件时还会继续回到当前的点继续执行。

协程由两部分组成,一个是迭代器:IEnumerator,还有就是调度器。调度器运行本质就是MonoBehaviour中的处于Update与LateUpdate之间的一个生命周期,要深入了解其中的关节,需要了解Unity脚本的全生命周期。启动协程就相当于把进程加入MonoBehaviour中。

本质上,我们也可以理解协程为一个加载在MonoBehaviour的一个方法,它的运行就是在主线程上,这一点要跟线程区别开来。这也是为什么在有些使用场景,我们要使用协程而不用线程,那是因为在Unity线程中是无法直接获取组件,对象等一些元素的。

更深入了解协程的运行机制就需要了解其中迭代器(IEnumerator)的机制,而协程是由yield return语句作为主体返回迭代器,它具有主动请求暂停提交唤醒条件,并保留当前位置,在下一帧条件满足时,重新唤醒,从当前位置继续执行后面语句的作用。

对于Unity规定的有yield return语句返回值有以下这些:

yield return null;  yield retun x;(x代表任意数字)  //下一帧再执行
yield break;  //结束协程
yield return new WaitForEndOfFrame(); //祯渲染完成后执行
yield return new WaitForSeconds(float f); //等待f秒后执行后续代码
yield return new WaitForSecondsRealtime(float f); //等待f秒后执行后续代码,不受timescale影响
yield return FunctionName(); //等待函数执行完毕
yield return AsyncOperation; //等待异步执行完毕
yield return Coroutine;  //等待执行完毕
yield return new WaitForFixedUpdate();  //等待物理祯结束
yield return new WaitUntil(arg);  //参数true执行后续代码
yield return new WaitWhile(arg);  //参数false执行后续代码

得以实现以上功能,IEnumerator它有两个重要方法:Current和MoveNext()。每帧执行时就会调用MoveNext()方法,判断是否是true,如果返回true,那么就可以访问Current,从而获取当前的返回值,就会从当前位置继续往下执行。

理解再多,重要还是使用方法:

应用场景:延时执行(计时器),创建补间动画,等待用户输入,打字机效果(文字输入如打字一样),复杂程序分帧处理(如Update中一个循环量很大,使用yileld return null 分帧处理,可以减少每帧执行量),异步加载(如ab资源加载,Resources资源加载,场景异步加载,www异步请求等)

首先要定义一个迭代器,可以带参数或者不带参数:

例:

IEnumerator()

{

yield return new WaitForEndOfFrame();

Debug.Log("到此结束");
}

启动有以下三种方法:StartCoroutine(string methodName);

StartCoroutine(IEnumerator routine);

StartCoroutine(string methodName,object values);

同理,停止使用方法:

StopCoroutine(string methodName);

StopCoroutine(IEnumerator routine);

StopCoroutine(Coroutine routine);

还有StopAllCoroutines(),可以停止所有协程。

缺点:开启会产生一定的GC

只要我们调用协程,就会创建迭代器,实例化一个接口对象,从而不可避免产生一定的垃圾,所以要慎用。

猜你喜欢

转载自blog.csdn.net/mr_five55/article/details/131026577