Unity 协程停不了?
你是不是遇到过协程停不了的情况?你是直接调用IEnumerator方法,如下?
void Start () {
StartCoroutine(IETest01());
StartCoroutine(IETest02());
}
IEnumerator IETest01()
{
Debug.LogError("IETest01");
yield return new WaitForSeconds();
StopCoroutine(IETest02());
yield return new WaitForSeconds();
Debug.LogError("IETest01 end");
}
IEnumerator IETest02()
{
Debug.LogError("IETest02");
yield return new WaitForSeconds();
Debug.LogError("IETest02 end");
}
不是协程停不了,是处理的方式不对。上面代码StopCoroutine(IETest02());相当于再调用了一次IETest02方法,和第一次调用StartCoroutine(IETest02());时返回的并不是同一个值。这里很好理解,普通的方法,多次调用,返回的值也不会指向同一段地址。
那么正确的方法应该怎么做呢?下面有三种参考方法:
1、通过函数名字符串
void Start () {
StartCoroutine("IETest01");
StartCoroutine("IETest02");
}
IEnumerator IETest01()
{
Debug.LogError("IETest01");
yield return new WaitForSeconds();
StopCoroutine("IETest02");
yield return new WaitForSeconds();
Debug.LogError("IETest01 end");
}
IEnumerator IETest02()
{
Debug.LogError("IETest02");
yield return new WaitForSeconds();
Debug.LogError("IETest02 end");
}
2、把返回值(IEnumerator )保存下来
IEnumerator ie1;
IEnumerator ie2;
void Start () {
ie1 = IETest01();
ie2 = IETest02();
StartCoroutine(ie1);
StartCoroutine(ie2);
} IEnumerator IETest01()
{
Debug.LogError("IETest01");
yield return new WaitForSeconds();
StopCoroutine(ie2);
yield return new WaitForSeconds();
Debug.LogError("IETest01 end");
}
IEnumerator IETest02()
{
Debug.LogError("IETest02");
yield return new WaitForSeconds();
Debug.LogError("IETest02 end");
}
后面两段代码执行不会打印"IETest02 end",协程中断成功
3、把StartCoroutine方法的返回值(Coroutine)保存起来
Coroutine c1, c2;
void Start()
{
c1 = StartCoroutine(IETest01());
c2 = StartCoroutine(IETest02());
}
IEnumerator IETest01(int v)
{
Debug.LogError("IETest01:" + v);
yield return new WaitForSeconds();
StopCoroutine(c1);
yield return new WaitForSeconds();
Debug.LogError("IETest01 end");
}
IEnumerator IETest02()
{
Debug.LogError("IETest02");
yield return new WaitForSeconds();
Debug.LogError("IETest02 end");
}
Unity 协程停不了?的更多相关文章
- 聊一聊Unity协程背后的实现原理
Unity开发不可避免的要用到协程(Coroutine),协程同步代码做异步任务的特性使程序员摆脱了曾经异步操作加回调的编码方式,使代码逻辑更加连贯易读.然而在惊讶于协程的好用与神奇的同时,因为不清楚 ...
- Unity协程(Coroutine)管理类——TaskManager工具分享
博客分类: Unity3D插件学习,工具分享 源码分析 Unity协程(Coroutine)管理类——TaskManager工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处 ...
- Unity协程(Coroutine)原理深入剖析
Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 其实协程并没有那么复杂,网上很多地方都说是多 ...
- Unity协程(Coroutine)原理深入剖析(转载)
记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield r ...
- unity协程coroutine浅析
转载请标明出处:http://www.cnblogs.com/zblade/ 一.序言 在unity的游戏开发中,对于异步操作,有一个避免不了的操作: 协程,以前一直理解的懵懵懂懂,最近认真充电了一下 ...
- Unity协程Coroutine使用总结和一些坑
原文摘自 Unity协程Coroutine使用总结和一些坑 MonoBehavior关于协程提供了下面几个接口: 可以使用函数或者函数名字符串来启动一个协程,同时可以用函数,函数名字符串,和Corou ...
- 深入浅出!从语义角度分析隐藏在Unity协程背后的原理
Unity的协程使用起来比较方便,但是由于其封装和隐藏了太多细节,使其看起来比较神秘.比如协程是否是真正的异步执行?协程与线程到底是什么关系?本文将从语义角度来分析隐藏在协程背后的原理,并使用C++来 ...
- Unity 协程使用指南
0x00 前言 在使用Unity的过程中,对协程仅仅知道怎样使用,但并不知道协程的内部机理,对于自己不清楚的部分就像一块大石压力心里.让自己感觉到担忧和不适. 这篇文章一探到底,彻底揭开协程的面纱,让 ...
- Unity协程(Coroutine)原理深入剖析再续
Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...
随机推荐
- demo:复制粘贴功能
复制链接功能,也是为了方便用户一键"复制",粘贴链接和文本到指定位置,在此,接着上一篇"demo:生成专属二维码link "来记录一键"复制" ...
- 访问WEB-INF下的jsp页面
访问web-inf下的jsp文件, 1)使用springMVC,一般都会使用springMVC的视图解析器,大概会这样配置 <!--jsp视图解析器--> <bean class ...
- 【工具相关】Web-Sublime Text2-注释
按Command+/ 会出现<!----> 如图所示: 参考资料:<菜鸟教程>
- map标签
map和area 标签配合img标签制作分区超链接效果 http://www.w3school.com.cn/tiy/t.asp?f=html_areamap
- IDEA项目搭建八——使用MybatisPlus简化数据库交互
一.MybatisPlus简化数据库交互 我们使用Mybatis发现需要在mapper.xml中写很多重复的简单CRUD(增删改查),使用MybatisPlus可以大大简化这部分代码,官方文档http ...
- Code::Blocks + GDAL
[root@server20 ~]# yum install cmake cmake-gui [root@server20 ~]# yum install cairo-devel libcurl-de ...
- 安卓开发之Room实体定义数据
使用Room实体定义数据 在Room库中,entities(实体)代表着相关字段集.每一个entity(实体)代表着相关联数据库中的一个表.entity 类必须通过Database 类中的entiti ...
- [OTA] 系统加密后Recovery是如何读取OTA升级包的
目前很多Android手机采用的FUSE方案,也就是内部SD卡不单独占用一个文件系统而实际上占用的是userdata的空间. 当系统加密后,解密需要VOLD的参于.而在Recovery模式下,是没有V ...
- Java —— 对象
创建对象 int[] b = new int[30]; 等号右侧:创建了一个数组对象 // 等号左侧:变量 b 称为该对应的引用 // 称作 变量 b 指向了一个对象 // 有时也简称为: b ...
- 重写EasyUI的$.fn.datagrid.defaults.editors
$.extend($.fn.datagrid.defaults.editors, { numberbox: { init: function (container, options) { var in ...