你是不是遇到过协程停不了的情况?你是直接调用IEnumerator方法,如下?

  1. void Start () {
  2. StartCoroutine(IETest01());
  3. StartCoroutine(IETest02());
  4. }
  5.  
  6. IEnumerator IETest01()
  7. {
  8. Debug.LogError("IETest01");
  9. yield return new WaitForSeconds();
  10. StopCoroutine(IETest02());
  11. yield return new WaitForSeconds();
  12. Debug.LogError("IETest01 end");
  13. }
  14. IEnumerator IETest02()
  15. {
  16. Debug.LogError("IETest02");
  17. yield return new WaitForSeconds();
  18. Debug.LogError("IETest02 end");
  19. }

不是协程停不了,是处理的方式不对。上面代码StopCoroutine(IETest02());相当于再调用了一次IETest02方法,和第一次调用StartCoroutine(IETest02());时返回的并不是同一个值。这里很好理解,普通的方法,多次调用,返回的值也不会指向同一段地址。

那么正确的方法应该怎么做呢?下面有三种参考方法:

1、通过函数名字符串

  1. void Start () {
  2. StartCoroutine("IETest01");
  3. StartCoroutine("IETest02");
  4. }
  5.  
  6. IEnumerator IETest01()
  7. {
  8. Debug.LogError("IETest01");
  9. yield return new WaitForSeconds();
  10. StopCoroutine("IETest02");
  11. yield return new WaitForSeconds();
  12. Debug.LogError("IETest01 end");
  13. }
  14. IEnumerator IETest02()
  15. {
  16. Debug.LogError("IETest02");
  17. yield return new WaitForSeconds();
  18. Debug.LogError("IETest02 end");
  19. }

2、把返回值(IEnumerator )保存下来

  1. IEnumerator ie1;
  2. IEnumerator ie2;
  3. void Start () {
  4. ie1 = IETest01();
  5. ie2 = IETest02();
  6. StartCoroutine(ie1);
  7. StartCoroutine(ie2);
  8. }
  9.  
  10. IEnumerator IETest01()
  11. {
  12. Debug.LogError("IETest01");
  13. yield return new WaitForSeconds();
  14. StopCoroutine(ie2);
  15. yield return new WaitForSeconds();
  16. Debug.LogError("IETest01 end");
  17. }
  18. IEnumerator IETest02()
  19. {
  20. Debug.LogError("IETest02");
  21. yield return new WaitForSeconds();
  22. Debug.LogError("IETest02 end");
  23. }

后面两段代码执行不会打印"IETest02 end",协程中断成功

3、把StartCoroutine方法的返回值(Coroutine)保存起来

  1. Coroutine c1, c2;
  2.  
  3. void Start()
  4. {
  5. c1 = StartCoroutine(IETest01());
  6. c2 = StartCoroutine(IETest02());
  7. }
  8.  
  9. IEnumerator IETest01(int v)
  10. {
  11. Debug.LogError("IETest01:" + v);
  12. yield return new WaitForSeconds();
  13. StopCoroutine(c1);
  14. yield return new WaitForSeconds();
  15. Debug.LogError("IETest01 end");
  16. }
  17. IEnumerator IETest02()
  18. {
  19. Debug.LogError("IETest02");
  20. yield return new WaitForSeconds();
  21. Debug.LogError("IETest02 end");
  22. }

Unity 协程停不了?的更多相关文章

  1. 聊一聊Unity协程背后的实现原理

    Unity开发不可避免的要用到协程(Coroutine),协程同步代码做异步任务的特性使程序员摆脱了曾经异步操作加回调的编码方式,使代码逻辑更加连贯易读.然而在惊讶于协程的好用与神奇的同时,因为不清楚 ...

  2. Unity协程(Coroutine)管理类——TaskManager工具分享

    博客分类: Unity3D插件学习,工具分享 源码分析   Unity协程(Coroutine)管理类——TaskManager工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处 ...

  3. Unity协程(Coroutine)原理深入剖析

    Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 其实协程并没有那么复杂,网上很多地方都说是多 ...

  4. Unity协程(Coroutine)原理深入剖析(转载)

    记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield r ...

  5. unity协程coroutine浅析

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.序言 在unity的游戏开发中,对于异步操作,有一个避免不了的操作: 协程,以前一直理解的懵懵懂懂,最近认真充电了一下 ...

  6. Unity协程Coroutine使用总结和一些坑

    原文摘自 Unity协程Coroutine使用总结和一些坑 MonoBehavior关于协程提供了下面几个接口: 可以使用函数或者函数名字符串来启动一个协程,同时可以用函数,函数名字符串,和Corou ...

  7. 深入浅出!从语义角度分析隐藏在Unity协程背后的原理

    Unity的协程使用起来比较方便,但是由于其封装和隐藏了太多细节,使其看起来比较神秘.比如协程是否是真正的异步执行?协程与线程到底是什么关系?本文将从语义角度来分析隐藏在协程背后的原理,并使用C++来 ...

  8. Unity 协程使用指南

    0x00 前言 在使用Unity的过程中,对协程仅仅知道怎样使用,但并不知道协程的内部机理,对于自己不清楚的部分就像一块大石压力心里.让自己感觉到担忧和不适. 这篇文章一探到底,彻底揭开协程的面纱,让 ...

  9. Unity协程(Coroutine)原理深入剖析再续

    Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...

随机推荐

  1. css中那些属性可以被继承

    主要的有: 字体相关:line-height, font-family, font-size, font-style, font-variant, font-weight, font 文本相关: le ...

  2. OSGI企业应用开发(十四)整合Spring、Mybatis、Spring MVC

    作为一个企业级的Web应用,MVC框架是必不可少的.Spring MVC目前使用也比较广泛,本文就来介绍一下如何在OSGI应用中实现Spring.Mybatis.Spring MVC框架的整合,其中S ...

  3. Git应用—05Git文件冲突合并的几种情况(转载)

    git文件冲突合并的几种情况 https://xieye.iteye.com/blog/2433229 本文描述了git冲突的几种常见情况和解决方案,老鸟请直接忽略本文.假设冲突文件是 test/Te ...

  4. NoHttp封装--03 cookie

    NoHttp请求自动维持Cookie:   1.支持Session.Cookie.临时Cookie的位置.   2.支持App重启.关机开机后继续持久化维持.   3.提供了接口,允许开发者监听Coo ...

  5. Java并发编程(五)Lock

    一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 在上面一篇文章中,我们了解到如果一个代码块被syn ...

  6. Django基础篇--用户权限管理和组管理

    Django作为一个成熟的python后台开发框架,为开发者提供了很多内置的功能,开发者只需要做一些配置就可以完成原生操作中比较复杂的代码编写.这些内置功能中其中一个比较强大的功能就是后台用户管理类. ...

  7. 利用搜狐新闻语料库训练100维的word2vec——使用python中的gensim模块

    关于word2vec的原理知识参考文章https://www.cnblogs.com/Micang/p/10235783.html 语料数据来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会, ...

  8. Java 中声明和语句

    public class Example { int[] arr = new int[4]; // OK! 定义属性并初始化 arr[0] = 1; // 错误! 这是语句,必须写在方法体里 arr[ ...

  9. forfiles命令详解

    目录复制命令: xcopy   //server/bak/*.*    d:/serverbak /s /e /v /c / d /y /h             at 05:30 shutdown ...

  10. FastReport脚本把数据绑定到文本控件上

    public class ReportScript { private void Data25_BeforePrint(object sender, EventArgs e)//Data25是指需要绑 ...