unity中协程介绍 定义 使用方法 使用场景介绍

在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;
        }
    }
}

协程的使用情景:

  1. 延迟执行:在游戏开始后一段时间内执行某个操作。

  2. 渐进变化:在一段时间内逐渐改变游戏对象的位置、旋转或缩放。

  3. 加载资源:在后台加载资源,而不阻塞主线程。

  4. 动画效果:实现自定义的动画效果。

  5. 网络通信:处理网络请求的异步响应。

  6. 游戏逻辑:执行需要一定时间才能完成的游戏逻辑

注意事项:

  • 协程是在MonoBehaviour的上下文中执行的,因此它们与游戏对象的生命周期相关联。
  • 如果启动协程的游戏对象被销毁,所有关联的协程也会被自动停止。
  • 协程不应该用于执行密集计算或长时间运行的任务,因为这可能导致帧率下降或游戏卡顿。

Unity脚本生命周期:

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值