[Unity3D] 协程

目录

前言

学习来源:

一、什么是协程

二、协程的应用举例

三、协程的使用方式

3.1  启动

3.2  结束

3.3  嵌套

3.4  注意

四、Unity脚本的生命周期

五、yield速查表 


前言

学习笔记,仅供学习,不做商用,如有侵权,联系我删除即可

学习来源:

Unity使用手册

Unity 协程(Coroutine)原理与用法详解https://blog.csdn.net/xinzhilinger/article/details/116240688?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168189731016800217270387%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168189731016800217270387&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-116240688-null-null.142%5Ev84%5Econtrol_2,239%5Ev2%5Einsert_chatgpt&utm_term=unity%E5%8D%8F%E7%A8%8B&spm=1018.2226.3001.4187

 Unity-协程详解https://blog.csdn.net/qq_44705559/article/details/118052537

一、什么是协程

协程就像一个函数,能够暂停执行并将控制权返还给 Unity,然后在下一帧继续执行

协程本质上是一个用返回类型 IEnumerator 声明的函数,并在主体中的某个位置包含 yield return 语句。

yield 的所在行是暂停执行并随后在下一帧恢复的点

在 yield 语句之间可以正确保留任何变量或参数

默认情况下,协程将在执行 yield 后的帧上恢复,但也可以使用 WaitForSeconds 来引入时间延迟

注意:

协程不是多线程,它与主线程同时运行,它在主线程运行的同时开启另一段逻辑处理。
类似一个子线程单独出来处理一些问题,性能开销较小。
Unity的协程会在每帧结束之后去检测的条件是否满足,满足则执行yield return之后的代码。

二、协程的应用举例

以下来自  Unity Documentation手册 (V2020.1)  中的叙述:

游戏中的许多任务需要定期执行,最容易想到的方法是将任务包含在 Update 函数中。

但是,通常情况下,每秒将多次调用该函数。不需要以这样的频繁程度重复任务时,可以将其放在协程中来进行定期更新,而不是每一帧都更新。

这方面的一个示例可能是在附近有敌人时向玩家发出的警报。此代码可能如下所示:

function ProximityCheck() 
{for (int i = 0; i < enemies.Length; i++){if (Vector3.Distance(transform.position, enemies[i].transform.position) < dangerDistance) {return true;}}return false;
}

如果有很多敌人,那么每帧都调用此函数可能会带来很大开销。但是,可以使用协程,每十分之一秒调用一次:

IEnumerator DoCheck() 
{for(;;) {ProximityCheck();yield return new WaitForSeconds(.1f);}
}

这将大大减少所进行的检查次数,而不会对游戏运行过程产生任何明显影响。 

三、协程的使用方式

3.1  启动

要将协程设置为运行状态,必须使用返回类型为 IEnumerator 声明的 StartCoroutine 函数

  • StartCoroutine(string methodName):这种是没有参数的情况,直接通过方法名(字符串形式)来开启协程
  • StartCoroutine(IEnumerator routine):通过方法形式调用
  • StartCoroutine(string methodName,object values):带参数的通过方法名进行调用

3.2  结束

可以使用 StopCoroutine 和 StopAllCoroutines 来停止协程。 当用 SetActive(false) 禁用某个协程所附加到的游戏对象时,该协程也将停止。

调用 Destroy(example)(其中 example 是一个 MonoBehaviour 实例)会立即触发 OnDisable,并会处理协程,从而有效地停止协程。

最后,在帧的末尾调用 OnDestroy

通过在 MonoBehaviour 实例上将 enabled 设置为 false 来禁用 MonoBehaviour 时,协程不会停止。

  • StopCoroutine(string methodName)通过方法名(字符串)来进行
  • StopCoroutine(IEnumerator routine):通过方法形式来调用
  • StopCoroutine(Coroutine routine)通过指定的协程来关闭

注意:

如果我们是使用StartCoroutine(string methodName)来开启一个协程的

那么结束协程就只能使用StopCoroutine(string methodName)StopCoroutine(Coroutine routine)来结束协程

3.3  嵌套

利用yield return StartCoroution(其它协程);可以实现多个协程的嵌套使用。

3.4  注意

  • IEnumerator 类型的方法不能带 ref 或者 out 型的参数,但可以带被传递的引用
  • 在函数 Update 和 FixedUpdate 中不能使用 yield 语句,否则会报错, 但是可以启动协程
  • 在一个协程中,StartCoroutine()和 yield return StartCoroutine()是不一样的。
  • 前者仅仅是开始一个新的Coroutine,这个新的Coroutine和现有Coroutine并行执行。
  • 后者是返回一个新的Coroutine,是一个中断指令,当这个新的Coroutine执行完毕后,才继承执行现有Coroutine。

四、Unity脚本的生命周期

根据生命周期图,当程序中设置协程时,程序的执行顺序为:(假设当前帧为第1帧)

  1. 第1帧在start中开启协程,执行协程(自上而下),执行到yield return行后,将后面的内容挂起。
  2. 这时继续执行第1帧剩下的东西直到第1帧Update执行结束。
  3. 在每一帧的update与lateupdate之间对挂起的内容进行判断,判断是否满足return条件。
  • 若满足条件,则在第2帧的Update之后,在LateUpdate前,执行协程中yield return 以后的代码;
  • 若不满足条件,则继续执行第1帧的LateUpdate。

第2帧的处理方法与第1帧相同。

五、yield速查表 

yield语句功能
yield return null;下一帧再执行后续代码
yield return 0;下一帧再执行后续代码
yield return 6;(任意数字)下一帧再执行后续代码
yield break;直接结束该协程的后续操作
yield return asyncOperation;等异步操作结束后再执行后续代码
yield return StartCoroution(其它协程);调用执行其它协程后再执行后续代码
yield return abc();等待abc操作完成后再执行后续代码
yield return new WaitForEndOfFrame();等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
yield return new WaitForSeconds(0.1f);等待0.1秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响);
yield return new WaitForSecondsRealtime(0.1f);等待0.1秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.timeScale的影响);
yield return WaitForFixedUpdate();等待下一次FixedUpdate开始时再执行后续代码
yield return new WaitUntil()将协同执行直到当输入的参数(或者委托)为true的时候
yield return new WaitWhile()将协同执行直到 当输入的参数(或者委托)为false的时候

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31800.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“AIGC早报”已内测2个月了,来看看她长什么样子

今天&#xff0c;是咱们社群“AI产品经理大本营”六周年活动的第二天&#xff0c;正式给大家介绍下&#xff0c;已内测2个月的重要会员权益——AIGC日报。 会分三个部分&#xff1a;效果口碑、我们如何做到的、今日的AIGC早报展示‍‍‍‍‍‍‍‍ ps&#xff0c;文末会发福利星…

何以驾驭AIGC领域的关键进程?得深邃技术得天下

“大海和火车成为那个世纪新兴经济的象征&#xff1a;强大、危险、难以驾驭和预测&#xff0c;但令人着迷和兴奋。” 这是诺贝尔经济学奖得主埃德蒙•费尔普斯曾在《大繁荣》一书中对19世纪有过这样的描述。 穿越回当下的21世纪&#xff0c;又有哪项发明具备这些特质&#xff…

【腾讯云 Cloud Studio 实战训练营】Cloud Studio实现健康上报小程序(代码开源)

目录 &#x1f373;前言&#x1f373;实验介绍&#x1f373;产品介绍&#x1f373;注册Cloud Stdio&#x1f373;后端Spring服务&#x1f373;创建项目上传项目数据库连接与导入 &#x1f373;Vue后台管理创建项目编辑模板信息选择环境镜像上传资源文件 &#x1f373;小程序⭐总…

【OpenMMLab AI实战营二期笔记】第七天 MMDetection代码课

0. 环境检测和安装 # 安装 mmengine 和 mmcv 依赖 # 为了防止后续版本变更导致的代码无法运行&#xff0c;暂时锁死版本 pip install -U "openmim0.3.7" mim install "mmengine0.7.1" mim install "mmcv2.0.0"# Install mmdetection rm -rf mmd…

AI实战营第二期 第六节 《MMDetection代码课》——笔记7

文章目录 什么是MMDetection&#xff1f;环境检测和安装1 数据集准备和可视化2 自定义配置文件3 训练前可视化验证4 模型训练5 模型测试和推理6 可视化分析MMYOLO 环境和依赖安装特征图可视化1. 可视化 backbone 输出的 3 个通道2. 可视化 neck 输出的 3 个通道 Grad-Based CAM…

最新!2023软科中国大学排名发布!

Datawhale高校 方向&#xff1a;软科中国大学排名&#xff0c;来源&#xff1a;软科 2023年3月30日&#xff0c;高等教育专业评价机构软科今日正式发布2023“软科中国大学专业排名”。 上榜高校共有590所&#xff0c;清华大学、北京大学、浙江大学连续9年蝉联全国三甲&#xf…

ChatGPT 和对话式 AI 的未来:2023 年的进展和应用

人工智能(Artificial Intelligence)在过去一段时间以来以前所未有的速度快速发展。从自动化日常任务到重要提醒的设定,AI以各种方式渗透到我们的生活中。然而,在这个领域中迈出的最重要一步是ChatGPT。 ChatGPT被瑞银(UBS)评为“有史以来增长最快的消费者应用程序”,于…

月薪13K!从零开始,小白转行程序员,三个月实现人生逆转~

思绪运转之间&#xff0c;上班也已经有一周了&#xff0c;我有想过给的所有老师都写一封感谢信的&#xff0c;但发现工作量太大了&#xff0c;只能用这一封信来表达对所有老师们的感谢。 软件测试&#xff0c;一个陌生的领域&#xff0c;对于一个毫无经验的小白来说&#xff0…

ChatGPT生成一篇文章:关于Docker

如今AI智能如火如荼&#xff0c;如果不会点ChatGPT总感觉有点落后了。最近刚好重新复习了一遍Docker&#xff0c;这里尝试通过ChatGPT来生成一篇关于Docker文章。来看效果。 1、什么是Docker Docker是一种容器化技术&#xff0c;可以将应用程序和它们的依赖项封装在一个虚拟的…

自主安装IPA文件到iPhone上

1.电脑下载iTunes&#xff0c;手机使用数据线连接在电脑上&#xff0c;一定要选择信任电脑 2.打开iTunes&#xff0c;点击手机图标 3.拖拽已下载的IPA文件到我的设备&#xff0c;蓝色高亮处&#xff0c;可以看到顶部的进度条&#xff0c;进度条完了可以查看手机&#xff0c;已…

iPhone 直接安装 .ipa包

有些App因为各种原因&#xff0c;不能直接通过App Store下载到&#xff0c;以前是可以在网上找到.ipa文件通过iTunes直接安装的。但是现在的版本已经不支持了。 官方的工具不好用&#xff0c;只好用民间的了。我们在电脑上下载一个爱思助手&#xff0c;然后将手机连接到电脑上…

实现 ipad 上看来自 v4l2 上的摄像头视频

配合 http://blog.csdn.net/sunkwei/archive/2011/06/07/6530343.aspx 实现在 ipad 上观看来自 v4l2 的摄像头视频. 先上ipad 抓屏图 这个做的很粗糙, 而且有些 opengl es 的概念也没有搞明白, 慢慢再补充吧.

【iOS开发】ipa安装到手机上的三种方式

转载地址&#xff1a;ipa安装到手机上的三种方式 ipa包 安装三种方式&#xff0c;优先推荐第一种方法&#xff08;通过iTunes安装&#xff09;。 1、通过iTunes安装 数据线连接手机之后&#xff0c;会自动连接iTunes&#xff0c;&#xff08;第一次连接的时候会提示是否信任…

iphone或者ipad上安装自己打包的ipa文件

对于非ios开发者来说&#xff0c;这确实是一个问题&#xff0c;但我懂的也不多&#xff0c;也是抱着试试的态度安装了下&#xff0c;之前我以为安装ipa和在安卓手机上安装apk一样&#xff0c;qq或者微信传文件下载点击就可以安装了&#xff0c;但这个ipa如果在iphone上这样做&a…

苹果如何安装ipa(亲测有用,无需越狱)

方法一 懒省事使用爱思助手即可&#xff08;需要签名&#xff09; 方法二 1.下载cydiaimpactor&#xff08;无需签名&#xff09; 官方地址 百度云下载&#xff1a;https://pan.baidu.com/s/1rYIG4go-fOEHarSjziA1eg 提取码&#xff1a;3b48 2.连上苹果手机&#xff0c;启动cy…

ios 程序发布成ipa 文件 通过 web 下载和安装。install App via OTA

转自&#xff1a; http://blog.csdn.net/totogogo/article/details/7391531 iOS 7.1正式版发布了&#xff0c;之前使用itms-services://URL方式在线安装ipa文件的方法却失效了&#xff0c;点击的时候报错为&#xff1a;“无法安装应用程序&#xff0c;因xxx.com的证书无效”&a…

IPA 包不经过APP Store直接发布到网站供用户下载安装

最近公司有需求&#xff0c;要把IOS客户端&#xff08;IPA包&#xff09;放到自己服务器上供用户下载&#xff0c;这样就能跳过APP Store 的审核。 准备条件 1.IOS 开发包 即IPA文件。 2.Plist文件。 3.https服务器&#xff08;IOS7.01之后必须https&#xff09; 准备条件…

iOS打包IPA教程

转载&#xff1a;xcode打包导出ipa 众所周知&#xff0c;在开发苹果应用时需要使用签名&#xff08;证书&#xff09;才能进行打包安装苹果 IPA&#xff0c;作为刚接触ios开发的同学&#xff0c;只是学习ios app开发内测&#xff0c;并没有上架appstore需求&#xff0c;对于苹…

如何用苹果app完成ipa安装

当打包完ipa文件后&#xff0c;ipa文件无法直接安装&#xff0c;只能添加udid安装到手机&#xff0c;或者上架才能安装&#xff0c;这里&#xff0c;我分享下使用本站工具上传ipa到app store&#xff0c;无需mac电脑完成ipa文件上架的详细步骤&#xff1a; 1、首先&#xff0c…

Mac 电脑下载 AppStore 中的 ipa 软件包详细流程

附&#xff1a;iPhone 移除描述文件详细步骤&#xff08;Apple Configurator 2&#xff09; 1、Mac 电脑中安装 Apple Configurator 2 软件。 2、电脑连接手机&#xff0c;并信任&#xff0c;在所有设备中&#xff0c;选中设备&#xff0c;然后点击顶部的加号&#xff0c;选…