在Unity中,一般的方法都是顺序执行的,一般的方法也基本都是在一帧中执行完毕的,当我们所写的方法需要耗费一定时间时,便会出现帧率下降,画面卡顿的现象。当我们想实现一个物体逐渐消失的过程时,由于Unity中方法是在一帧执行完成的,所以达不到预期的效果,这时候就可以依靠协程来实现物体平滑消失的情况。协程可以通过yield在任何时刻暂停,也可以在上一次执行结束时,再接着上一次执行后执行,提供了极大的便利性。
协程定义:
它允许开发者编写顺序执行的代码,而Unity引擎会在每一帧中自动管理这些代码的执行。协程主要用于执行那些需要一段时间才能完成的任务,如等待一定时间后执行某个操作,或者在一定时间内逐渐改变游戏对象的属性。
1.与方法一样,协程也是一种程序组件。
2.相对一般方法而言,协程更为灵活,方法只有一个入口, 而协程可以有多个入口和出口点,可以用协程来实现任 何的方法。
3.协程更适合于用来实现如合作式多任务,迭代器,无限 列表。
4.开始一个协程时,执行从被调用方法的起始处开始;然 而,接下来的每次协程被调用时,从协程返回(yield return )的位置接着执行。
5.协程是单线程的
协程的实现:
• Unity协程实现主要组成
– IEnumerator接口 提供迭代
– yield return xxxx 指定下一次迭代入口 协程的暂停的恢复
• WaitForFixedUpdate 在FixedUpdate后执行
– 适合于物理控制,
• null、0、WaitForSeconds 在每帧Update后执行
– 适合于分多帧完成一个任务,如A*路径计算
• WaitForEndOfFrame 在每帧结束后执行
– 适合于每帧末尾执行的操作,如相机的控制
• WWW 在请求结束后执行
– 适合于网络下载数据。
StartCoroutine 开启协程
StartCoroutine(“协程方法名”) (可以用 StopCoroutine(“协程方法名”)停止协程的运行)
StartCoroutine(协程方法)。(只能用StopAllCoroutine()停止运行)
yield return的介绍:
yield return null; // 下一帧再执行后续代码
yield return 0; //下一帧再执行后续代码
yield return 6;//(任意数字) 下一帧再执行后续代码
yield break; //直接结束该协程的后续操作
yield return asyncOperation;//等异步操作结束后再执行后续代码
yield return StartCoroution(/*某个协程*/);//等待某个协程执行完毕后再执行后续代码
yield return WWW();//等待WWW操作完成后再执行后续代码
yield return new WaitForEndOfFrame();//等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响);
yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.timeScale的影响);
yield return WaitForFixedUpdate();//等待下一次FixedUpdate开始时再执行后续代码
yield return new WaitUntil()//将协同执行直到 当输入的参数(或者委托)为true的时候....如:yield return new WaitUntil(() => frame >= 10);
yield return new WaitWhile()//将协同执行直到 当输入的参数(或者委托)为false的时候.... 如:yield return new WaitWhile(() => frame < 10);
协程的停止:
• StopCoroutine(string)
– StopCoroutine(“协程方法名”)
– 只能停止以StartCoroutine(“协程方法名”) 开启的协程
• StopAllCoroutine()
– 停止本对象中开启的所有协程
协程的终止:
yield break;
来终止协程的执行。
IEnumerator MyCoroutineWithBreak()
{
while (true)
{
yield return null;
// 某些条件满足时终止协程
if (someCondition)
{
yield break;
}
}
}
协程的使用情景:
-
延迟执行:在游戏开始后一段时间内执行某个操作。
-
渐进变化:在一段时间内逐渐改变游戏对象的位置、旋转或缩放。
-
加载资源:在后台加载资源,而不阻塞主线程。
-
动画效果:实现自定义的动画效果。
-
网络通信:处理网络请求的异步响应。
-
游戏逻辑:执行需要一定时间才能完成的游戏逻辑
注意事项:
- 协程是在MonoBehaviour的上下文中执行的,因此它们与游戏对象的生命周期相关联。
- 如果启动协程的游戏对象被销毁,所有关联的协程也会被自动停止。
- 协程不应该用于执行密集计算或长时间运行的任务,因为这可能导致帧率下降或游戏卡顿。
Unity脚本生命周期: