博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity 协程停不了?
阅读量:6952 次
发布时间:2019-06-27

本文共 2372 字,大约阅读时间需要 7 分钟。

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

void Start () {        StartCoroutine(IETest01());        StartCoroutine(IETest02());    }    IEnumerator IETest01()    {        Debug.LogError("IETest01");        yield return new WaitForSeconds(1);        StopCoroutine(IETest02());        yield return new WaitForSeconds(1);        Debug.LogError("IETest01 end");    }    IEnumerator IETest02()    {        Debug.LogError("IETest02");        yield return new WaitForSeconds(2);        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(1);        StopCoroutine("IETest02");        yield return new WaitForSeconds(1);        Debug.LogError("IETest01 end");    }    IEnumerator IETest02()    {        Debug.LogError("IETest02");        yield return new WaitForSeconds(2);        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(1);        StopCoroutine(ie2);        yield return new WaitForSeconds(1);        Debug.LogError("IETest01 end");    }    IEnumerator IETest02()    {        Debug.LogError("IETest02");        yield return new WaitForSeconds(2);        Debug.LogError("IETest02 end");    }

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

 

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

Coroutine c1, c2;    void Start()    {        c1 = StartCoroutine(IETest01(100));        c2 = StartCoroutine(IETest02());    }    IEnumerator IETest01(int v)    {        Debug.LogError("IETest01:" + v);        yield return new WaitForSeconds(1);        StopCoroutine(c1);        yield return new WaitForSeconds(1);        Debug.LogError("IETest01 end");    }    IEnumerator IETest02()    {        Debug.LogError("IETest02");        yield return new WaitForSeconds(2);        Debug.LogError("IETest02 end");    }

 

转载于:https://www.cnblogs.com/yougoo/p/8918212.html

你可能感兴趣的文章
丰田栽了的原因,嵌入式软件工程师都该看看
查看>>
链式队列(c语言)
查看>>
ARIMA模型---时间序列分析---温度预测
查看>>
Windows10下安装Maven以及Eclipse安装Maven插件 + 创建Maven项目
查看>>
性能测试学习第七天_脚本概要
查看>>
socket网络编程基础模块
查看>>
滚动表格固定表头和左边栏
查看>>
UVA 10859 Placing Lampposts 树形DP
查看>>
Shiro
查看>>
来上海八年了,有时候有些事还是会让我感到惊艳
查看>>
bzoj 3223 裸splay
查看>>
nchar、char、varchar与nvarchar区别
查看>>
iOS 之 socket 与 http
查看>>
python自学2018/03/21-实时刷新进度条小程序
查看>>
个人笔记--------错误解决记录-------Servlet.init() for servlet rest threw exception
查看>>
团队-象棋游戏-项目进度
查看>>
两列布局的基本思路
查看>>
python logging 重复写日志问题
查看>>
RAC4——架构和变化
查看>>
jQuery基础与实例
查看>>