你是不是遇到过协程停不了的情况?你是直接调用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 协程停不了?的更多相关文章

  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. SP8093 JZPGYZ - Sevenk Love Oimaster(广义后缀自动机)

    题意 题目链接 Sol 广义后缀自动机板子题..和BZOJ串那个题很像 首先建出询问串的SAM,然后统计一下每个节点被多少个串包含 最后直接拿询问串上去跑就行了 #include<bits/st ...

  2. 【代码笔记】Web-HTML-图像

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  3. Flutter 布局(十)- ListBody、ListView、CustomMultiChildLayout详解

    本文主要介绍Flutter布局中的ListBody.ListView.CustomMultiChildLayout控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. ListBody ...

  4. 洗礼灵魂,修炼python(37)--面向对象编程(7)—了解魔法方法

    也许上一篇博文提到的property内置函数的用法你还觉得记忆犹新,那么有没有更多的类似的方法呢?有的,就是本篇文章要说的魔法方法 魔法方法 1.什么是魔法方法 (其实前面已经提到多次,每次我都是说暂 ...

  5. 模拟开户接口,使用shell脚本实现批量用户开通

    1.目的 通过模拟接口方法,实现批量用户开通 2.分析 A.接口含body和head部分,其中body中的某些变量为必填字段,包含用户的信息,接口可整理成body.xml.head.xml文件. B. ...

  6. 常用Linux 服务器命令--各种性能指标命令

    如果你想知道你的服务器正在做干什么,你就需要了解一些基本的命令,一旦你精通了这些命令,那你就是一个专业的 Linux 系统管理员. 监控命令## iostat### iostat命令用来显示存储系统的 ...

  7. CRM lookup筛选

    function Loadcouse() { var type; var id; retrieveRecord(Xrm.Page.getAttribute("ownerid").g ...

  8. February 6th, 2018 Week 6th Tuesday

    To be is to be perceived. 存在即被感知. How to interpret this quote? Maybe it means that everything in you ...

  9. Deepin系统安装mysql教程及相关操作

    Deepin系统安装mysql教程及相关操作 1.安装MySQL sudo apt-get install mysql-server,期间需要输入两次密码,root账户的密码. sudo apt-ge ...

  10. PyQt5--QComboBox

    # -*- coding:utf-8 -*- ''' Created on Sep 20, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...