zoukankan      html  css  js  c++  java
  • Unity 协程停不了?

    你是不是遇到过协程停不了的情况?你是直接调用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");
        }
  • 相关阅读:
    centos7中如何让网卡名不被改变
    设置git使用vim作为编辑器
    vim复制时保留原有格式
    Linux添加自定义命令方法
    从graphite中删除字段信息
    jquery图片上传新思路
    注册代码
    JQ基本和层级选择器-p9-09
    DOM对象和JQ对象相互转换
    DOM对象和JQuery对象
  • 原文地址:https://www.cnblogs.com/yougoo/p/8918212.html
Copyright © 2011-2022 走看看