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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
协程Unity中是一种非常重要的多任务处理方式,它能够方便地进行异步等待操作,使代码更加优雅。在Unity中,协程实际上是一种函数,可以被中断和恢复执行。当协程执行到yield return语句时,它会暂停执行并将控制权交给协程管理器,让其他协程或主线程有机会执行。当等待的条件满足后,协程管理器会恢复执行该协程。 下面是一个简单的Unity协程使用示例,用于实现一个计时器程序: ```csharp public IEnumerator StartTime() { while (second > 0) { yield return new WaitForSeconds(1); second--; changeText(); Debug.Log(second); } if (second == 0) { button_xuzi.interactable = true; } } ``` 在这个示例中,`StartTime`是一个协程函数,通过使用`yield return new WaitForSeconds(1)`来实现每隔1秒执行一次循环体内的代码。当`second`大于0时,循环继续执行,否则计时器停止并激活一个按钮。 需要注意的是,协程在使用时应避免让一个协程永远不退出,例如使用`while(true)`这样的循环。这样的用法可能会导致内存问题,因此不建议这样使用协程。\[3\] 希望这个示例能帮助你理解Unity协程的使用。 #### 引用[.reference_title] - *1* *3* [深入探讨Unity协程及其使用](https://blog.csdn.net/sdhexu/article/details/129145654)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Unity协程的简单应用](https://blog.csdn.net/qq_45498613/article/details/129269894)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不在同一频道上的呆子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值