首页 > 其他分享 >Unity Coroutine 协程概述

Unity Coroutine 协程概述

时间:2024-02-11 18:22:39浏览次数:27  
标签:return Coroutine yield Unity Time 协程 执行 方法

协程技术是将一个方法切分到不同帧上执行的技术,但是他和多线程有本质区别,多线程技术是利用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中运行这段代码时我们得到了以下结果。
image
更多关于StartCoroutine的信息请参考官方文档MonoBehaviour.StartCoroutine。当然除了开始一个协程之外,我们还可以停止一个协程,而停止协程的方法就是StopCoroutine,参数同样是需要停止的协程的名称。

我们示例当中的协程没有任何的参数,但协程肯定是允许传参的,这跟普通方法的参数没有什么区别就不再详细说明了,但是要记住在使用StartCoroutine的时候要记住将协程的参数写完整。

最后,协程还有很多的高阶段的操作,比如自定义yield return的内容(keepwaiting),协程之间的嵌套等等,这里就不再赘述,有需要的时候再自行查阅。

标签:return,Coroutine,yield,Unity,Time,协程,执行,方法
From: https://www.cnblogs.com/HalfDog/p/18013431

相关文章

  • 【踩坑】Unity Android(安卓)平台 Render texture 有残留,即使调用 DiscardContents 还
    在编辑器环境下OK,打包成PC客户端也OK,但是打包成apk,在安卓手机上运行的时候就会有残留。 我的代码如下。主要是在LateUpdate()中,修改特定摄像机的cullmask,在捕捉到制定的rendertexture上(即此处的m_levelUnitRT)。 voidLateUpdate(){if(m_levelU......
  • 关于unity游戏如何查看方法名所属类名及函数
    各位,新年好啊废话不多说以set_HP为例这是方法名附件特征码,方便定位我们进行搜索(注:ca内存)在s位置进行指针搜索可以看到出现4个数据说明,方法名为set_HP的函数及其所属类名有4个我们以第4个为例转到可以看到他的附近是一堆指针我们以搜索到的指针为本在他偏移-8的地......
  • Unity Scriptable Object概述
    如何理解ScriptableObjectScriptableObject是一种数据容器(datacontainer),通常被用来存储大量的数据,并且不依赖于类实例。换句话说,ScriptableObject本身就是一个存放数据的实例。ScriptableObject没有继承自MonoBehavior,而是继承自ScriptableObject,所以ScriptableObject不能......
  • NuGetForUnity用不了时的一个折衷方案
    如果NuGetForUnity网络访问不了或者下载速度非常慢,导致无法正常使用,那可以试试下面的方法。 1)先用vs的NuGet包管理器下载,vs下貌似没遇到网络问题,下载很快 注意,vs不是下载在Unity的Assets文件夹下的,而是和他同层级,所以此时Unity并不会加载所下载的dll文件的 2)然后......
  • 协程概览
    目录什么是协程协程的优缺点:协程的分类对称协程与⾮对称协程有栈协程与⽆栈协程什么是协程我们可以简单的认为:协程就是用户态的线程,但是上下文切换的时机是靠调用方(写代码的开发人员)自身去控制的;同时,协程和用户态线程非常接近,用户态线程之间的切换不需要陷入内核,但部分操作系统......
  • Unity Navigation导航系统
    一、Navigation导航系统基本介绍Navigation导航系统是unity的寻路组件,将静态或动态的复杂场景烘焙简化为简单的(NavMesh)导航网格用于AI寻路计算。值得注意的是,这个组件的NavMesh系统存在一些性能和使用场景上的缺陷,如很难在运行时修改navmesh、场景过大会造成内存上的开销,以及不支......
  • Unity接入 KimiChat 代码示例
    代码usingSystem.Runtime.CompilerServices;usingSystem.Threading.Tasks;usingUnityEngine;usingUnityEngine.Networking;publicclassTestKimi:MonoBehaviour{privatestringapiKey="YourKey";//替换为你的API密钥privatestringapiUrl=......
  • 限制Unity帧率的方式
    1)限制Unity帧率的方式2)只在编辑器内,纹理不开启Read&Write情况下,如何获取纹理所有颜色值3)如何在FBX剔除Lit.shader依4)如何在iPhone12mini设备上禁止竖屏这是第373篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习......
  • 【Unity】记一次卡顿优化(由3D资源面数过多引起)
    这个优化方法可能仅对我有效,我只是做一个记录条件:模型很大,并且shader中使用了Smoothness优化方法打开Mesh引用的模型修改模型Normal为calculate修改SmoothnessSource为fromAngle修改SmoothingAngle降到你可以接收的值,我设置的是20。在unity文档中说的是,通常SmoothingAn......
  • Unity Mono单例(MonoSingleton)C#脚本
    什么是单例模式?单例模式是设计模式的一种,一般来说,使用单例模式的类,在程序中全局只会存在一个实例,并且一般来讲其是全局可被访问的。在unity游戏开发中,单例模式广泛应用于GameManager和各种Controller这种只需要一个实例的脚本。以下就是UnityMono单例的泛用脚本usingSystem.......