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");
    }

 

posted @ 2018-04-23 13:13  吃斤欢乐豆  阅读(965)  评论(0编辑  收藏  举报