Unity 协程(coroutine)详细使用

1:只讲使用,没有介绍(因为。。。不会介绍),使用的是unity5.5

2:使用

(1)如何开启协程和关闭协程?

开启协程和关闭协程有两种,第1种是通过XX开启关闭,第2种是通过字符串开启关闭

第一种:

 private Coroutine coroutine;
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            coroutine = StartCoroutine(IETestCoroutine());
        }
        else if (Input.GetKeyDown(KeyCode.Space))
        {
            if (coroutine != null)
                StopCoroutine(coroutine);
        }
    }
    IEnumerator IETestCoroutine()
    {
        while (true)
        {
            yield return null;
            Debug.Log("coroutine");
        }
    }
或者:

 private IEnumerator coroutine;
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            coroutine = IETestCoroutine();
            StartCoroutine(coroutine);
        }
        else if (Input.GetKeyDown(KeyCode.Space))
        {
            if (coroutine != null)
                StopCoroutine(coroutine);
        }
    }
    IEnumerator IETestCoroutine()
    {
        while (true)
        {
            yield return null;
            Debug.Log("coroutine");
        }
    }
第二种通过字符串形式:

   

 void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            StartCoroutine("IETestCoroutine");
        }
        else if (Input.GetKeyDown(KeyCode.Space))
        {
           StopCoroutine("IETestCoroutine");
        }
    }
    IEnumerator IETestCoroutine()
    {
        while (true)
        {
            yield return null;
            Debug.Log("coroutine");
        }
    }
建议用第一种!!!


3:介绍下协程里面的几个方法

当我们需要用协程等待具体的时间可以用

(1)

 IEnumerator IETestCoroutine()
    {
        //等待1s,受time.scale限制
        yield return new WaitForSeconds(1f);

        //等待1s,不收time.scale限制
        //yield return new WaitForSecondsRealtime(1f);

        //do something......
    }
这里介绍一下
yield return new WaitForSecondsRealtime

这个呢是不受time.scale 限制的,如果你有调节time.scale,那么使用这个方法将不会受影响

(2)重点介绍 yield return new WaitUntil();  yield return new WaitWhile();这两个方法

(.1)yield return new WaitUntil()的使用,WaitUnitl指的意思就是当满足这个条件的时候才会执行下面的语句,比如

 private bool isDownSpace = false;
    void Start()
    {
        StartCoroutine(IETestCoroutine());
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            isDownSpace = true;
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            isDownSpace = false;
        }
    }
    IEnumerator IETestCoroutine()
    {
        yield return new WaitUntil(TestResult);
        Debug.Log("Space down");
    }
    bool TestResult()
    {
        return isDownSpace;
    }
只有我们按下空格键,才会打印“Space down”这句话,这是一个条件等待,waitUnitl里面是个Func委托,我们也可以这样

    private bool isDownSpace = false;
    void Start()
    {
        StartCoroutine(IETestCoroutine());
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            isDownSpace = true;
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            isDownSpace = false;
        }
    }
    IEnumerator IETestCoroutine()
    {
        yield return new WaitUntil(()=>isDownSpace==true);
        Debug.Log("Space down");
    }
这两个效果是一样的

(.2)yield return new Wait While()的使用,

  private bool isDownSpace = true;
    void Start()
    {
        StartCoroutine(IETestCoroutine());
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            isDownSpace = true;
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            isDownSpace = false;
        }
    }
    IEnumerator IETestCoroutine()
    {
        yield return new WaitWhile(()=>isDownSpace);
        Debug.Log("Space down");
    }
这里我将isDownSpace 初始值为true,当我们按下S的时候就会打印" Space down” 这句话。。。。

没错你可能觉察到了,这个和waitUntil相反,官方也解释的很清楚

waitUntil :Suspends the coroutine execution until the supplied delegate evaluates to true

waitWhile:Suspends the coroutine execution until the supplied delegate evaluates to false.

附上链接哈,里面也有例子,如果我举得这个例子不好的话,看看官方的,https://docs.unity3d.com/ScriptReference/WaitWhile.html

就比如说:

waitUntil

 //当满足后面的委托条件返回为true的时候执行下面的这句话

            //这里就是isDonwSpace为true的时候执行下面的话
            yield return new WaitUntil(() => isDownSpace==true);
            Debug.Log("Space down true");
            //这里就是isDonwSpace为false的时候执行下面的话
            yield return new WaitUntil(() => isDownSpace == false);
            Debug.Log("Space down false");

waitWhile

//当满足后面的委托条件返回为false的时候执行下面的这句话

            //这里就是isDonwSpace为false的时候执行下面的话
            yield return new WaitWhile(() => isDownSpace == true);
            Debug.Log("Space down false");

            //这里就是isDonwSpace为true的时候执行下面的话
            yield return new WaitWhile(() => isDownSpace == false);
            Debug.Log("Space down true");

ok。。。懂了不?




你可能感兴趣的:(unity)