Unity 之 关于停止协程的五种方式解析
Unity 之 关于停止协程的五种方式解析
- 前言:了解协程
- 方式一:函数的方式
- 方式二:函数名的方式
- 方式三:接收返回值
- 方式四:StopAllCoroutines
- 方式五:禁用/销毁游戏对象
- 本文小结:
前言:了解协程
官方描述 调用函数时,函数将运行到完成状态,然后返回。这实际上意味着在函数中发生的任何动作都必须在单帧更新内发生;函数调用不能用于包含程序性动画或随时间推移的一系列事件。
协程是一个可暂停执行 (yield) 直到给定的 YieldInstruction 达到完成状态的函数。
协程的不同用法:
- yield 在下一帧上调用所有 Update 函数后,协程将继续。
- yield WaitForSeconds 在为帧调用所有 Update 函数后,在指定的时间延迟后继续协程
- yield WaitForFixedUpdate 在所有脚本上调用所有 FixedUpdate 后继续协程
- yield WWW 在 WWW 下载完成后继续。
- yield StartCoroutine 将协程链接起来,并会等待 MyFunc 协程先完成。
协程的误用:
- 如果一个协程几乎每帧都运行并且在长时间运行操作中不会暂停,那么用 Update 或 LateUpdate 回调来替换该协程通常更合理一些。例如长时间运行或无限循环的协程。
- 尽可能的减少嵌套使用:虽然嵌套的协程非常有利于确保代码的条理性和进行维护,但协程跟踪对象本身会导致产生更高的内存开销。
方式一:函数的方式
使用传递函数的方式来 开启协程:
StartCoroutine(Cor_1());
停止协程:(❎ 错误的使用方式1)
StopCoroutine(Cor_1());
最初学习的时候就这么干的,但是不知道为什么就是不好用。后来才明白:虽然传递的是一样的函数名,但是停止时传递进去的并不是开始时传递的函数的地址啊~。
停止协程:(❎ 错误的使用方式2)
StopCoroutine(”Cor_1“);
新手的错误用法:使用传递函数的方式开启协程,使用传递字符串的形式停止协程。
那么使用StartCoroutine(Cor_1());
这种方式开启协程,要如何才能手动停掉它呢?请继续往下看…
方式二:函数名的方式
使用传递函数名的方式 开启协程:
StartCoroutine("Cor_1");
停止协程:
StopCoroutine(”Cor_1“);
这样使用是没问题的(我猜测是内部是实现是通过<Key, Value>的形式保存了一下)。
缺点:只支持传递一个参数。
由一,二得出结论,只有通过函数名的形式开启和关闭是可行的,但是这并没有解决我们方式一中留下的问题,请继续往下看吧…
方式三:接收返回值
不管使用下面哪种方式启动协程,都可以结束其返回值用以停止对应协程;
private Coroutine stopCor_1;
private Coroutine stopCor_2;stopCor_1 = StartCoroutine("Cor_1");
stopCor_2 = StartCoroutine(Cor_2());
停止协程:
StopCoroutine(stopCor_1);
StopCoroutine(stopCor_2);
使用这种接收返回值的方式就可以根据我们的需求来停止协程了;
这就解决了方式一,二中留下的问题。
方式四:StopAllCoroutines
任意一种方式开始协程
StartCoroutine("Cor_1");
StartCoroutine(Cor_2());
都可以使用StopAllCoroutines
去停止
StopAllCoroutines();
StopAllCoroutines() 可以停止当前脚本中所有协程。
注意事项:
- 建议谨慎使用,因为可能后续修改逻辑时新建协程,在不需要被停止的情况下停止(别问我怎么知道的)
- 需要确定调用脚本的全部协程都需要被终止(比如:断线重连需要重置所有状态)
方式五:禁用/销毁游戏对象
注意是:
gameObject.SetActive(false);
//通过销毁游戏对象方式和禁用同效果
//Destroy(gameobject)
不是这个:
script.enabled = false;
也就是隐藏脚本所挂载的游戏物体(其父物体被隐藏时也是一样),如下图:
当物体被再次激活时,协程不会继续执行
本文小结:
- 使用 StartCoroutine(函数()); 形式开启的,只能用接收返回值的形式去停止;【不限制参数个数】
- 使用 StartCoroutine(“函数名”); 形式开启的,可以使用 StopCoroutine(“函数名”); 形式停止, 也可使用 接收返回值的形式去停止。【缺点:只可以传递一个参数】
- 两种开启形式均受到 StopAllCoroutines() 控制。StopAllCoroutines() 可以停止当前脚本中所有协程。
- gameObject.SetActive(false); 可停掉所有此GameObject上的所有协程,且再次激活时协程不会继续。
- StopCoroutine(函数()); 脚本.enabled = false; 不可停掉协程。
Unity 之 关于停止协程的五种方式解析相关推荐
- Go中协程间通信的方式Sync.Cond
在Go中协程间通信的方式有多种,最常用的是channel.如果牵扯多个协程的通知,可以使用sync.Cond. 1. 程序中的通信方式 GO语言中有句名言:"不要用共享内存来通信,而是使用通 ...
- 深入理解异步I/O+epoll+协程,附上epoll原理解析以及协程现实与原理剖析视频
前言 同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行:而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会 ...
- 【JDBC篇】Java连接数据库的五种方式,及什么是URL?
目录 URL介绍: 连接数据库的五种方式 方式一: 方式二: 方式三: 方式四: 方式五:(最终版) URL介绍: JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择 ...
- java中读取properties文件内容五种方式
一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...
- SSH深度历险(六) 深入浅出----- Spring事务配置的五种方式
这对时间在学习SSH中Spring架构,Spring的事务配置做了具体总结.在此之间对Spring的事务配置仅仅是停留在听说的阶段,总结一下.总体把控.通过这次的学习发觉Spring的事务配置仅仅要把 ...
- android ui 最新教程,Android更新UI的五种方式,androidui五种
Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...
- CSS 五种方式实现 Footer 置底
CSS 五种方式实现 Footer 置底 页脚置底(Sticky footer) 就是让网页的footer部分始终在浏览器窗口的底部. 当网页内容足够长以至超出浏览器可视高度时,页脚会随着内容被推到网 ...
- 下列哪个不是目前python里的内置模块-python引入模块的五种方式与内置模块
模块导入的五种方式 1.import 模块名 2.from 模块名 import 方法名 3.from 模块名 import * 4.import 模块名 as 别名 5.from 模块名 impor ...
- java clone方法_干货满满:Java中创建对象的五种方式详解
通常来说,对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为. 作为Java开发者,我们通常都是使用依赖管理系统,比如Spring去创建Java对象,但使用管理系统创建对象并不是唯一 ...
最新文章
- Symfony2Book16:Symfony2内部02-内核
- 爬虫python的爬取步骤-Python爬虫爬取数据的步骤
- nginx配置location总结及rewrite规则写法
- JS事件及其兼容用法
- 4.3.2 基于集合的操作
- 快速排序的原理以及Java代码
- Windows服务器学习篇:服务器连接与退出
- Strtus2标签s:url
- 2013年最新省市区三级联动mysql数据库_省市区三级联动菜单(附数据库)
- 解决jqueryUI img tilte样式不显示问题
- Windows密码复杂性要求
- 倍福ADS通讯(三)——ADS通讯协议包格式
- frame切换/窗口切换
- 比例谐振(PR)控制
- Android-NFC模块学习(1)
- C++异常机制的实现方式和开销分析(作者:白杨)
- 搜索:多模态搜索算法实践【工业界:将其他模态(视频、音频)的信息降维到文本模态】【学术界:将所有模型信息映射到公共向量空间】
- python 键盘钩子_WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例...
- 通过数据泵expdp、impdp方式备份与还原(导出与导入)Oracle数据库
- js刷新页面,刷新当前页