Unity5中的Coroutine和yield return

版权声明:本文为博主原创文章,未经允许不得转载。 https://blog.csdn.net/Jekin_KE/article/details/87953583

一、Coroutine(协同程序)

Coroutine,就是在主程序运行的同时开启另一个线程,来协同当前程序的执行。在一般规模较大的游戏中常常需要使用协程,这样的好处是——协程在协调在几帧中执行的操作时有极大的用处,因为协程几乎无性能开销。

一般来说,我们有两种方法来开启一个线程,StartCoroutine(string Name)和StartCoroutine(IEnumerator Routine)。

前者可以开启线程并在线程结束前终止线程,而后者只能等待线程的结束而不能随时终止;另外使用StartCoroutine(string Name)时,开启线程时最多只能传递一个参数,与此同时性能消耗也会增大;而使用StartCoroutine(IEnumerator Routine)则没有这个限制。

而关闭协程也有两种方法,StopCoroutine(string Name)和StopAllCoroutines()。但是后者是用来终止所有Coroutine,这里使用时需要注意。

二、Yield return(Coroutine中返回调用迭代语句)

在协程中,必须需要Yield return来返回值,而yield return的值决定了什么时候使该协程恢复执行。yield return 后面可以接几种值:

  1. yield return + “int类型的值”。指当前暂停一帧,从下一帧继续开始执行。
  2. yield return + “协程”。yield return 后面可以跟一个协程,当执行到该行代码的时候执行其后面的协程,如果下面还有代码在执行完yield return 后面的协程时候,回来继续执行。例如:yield return StartCoroutine(xxx());
  3. yield return new WaitForSeconds(时间)。这主要是等待几秒钟后执行再yield return 后面的代码。
  4. yield return + “自定义的类”。

三、关于多个Coroutine的执行顺序

话不多说,我们先上代码看看:

void Start () {
            Debug.Log("x1");
            StartCoroutine(Test());
            Debug.Log("x2");
        }
    
       IEnumerator Test()
        {
            Debug.Log("y1");
            yield return new WaitForSeconds(5);//等待5s后再进行调用返回
            Debug.Log("y2");
        }

这里的执行结果:x1 -> y1 -> x2 -> y2 ,y2是等待5s后才执行出来的结果。

如果这里能理解的话,我们再看看稍微难一点的:

void Start () {
        Debug.Log("a1");
        StartCoroutine(First());
        Debug.Log("a2");
    }

   IEnumerator First()
    {
        Debug.Log("b1");
        yield return StartCoroutine(Second());
        Debug.Log("b2");
    }
    
   IEnumerator Second()
    {
        Debug.Log("c1");
        yield return null;
        Debug.Log("c2");
    }

这里的执行结果:a1 -> b1 -> c1 -> a2 -> c2 -> b2

原因:这种StartCoroutine中嵌套一个yield return StartCoroutine,此时有两个Coroutine存在;那么First()会等到Second()中所有代码执行完毕后再继续执行,而Second()中的yield语句会先返回到First(),然后立即返回到First()的调用处,也就是Start ()会继续执行,Start ()执行完毕后会跳回到Second()进行执行,这是最先发出“返回调用”的地方,而First()会等待Second()执行完再继续执行。

好了,Unity中的Coroutine和yield return基本功能大概就这些,如果想更深入理解的话建议大家到Unity官网中查看对应的官方解释。

猜你喜欢

转载自blog.csdn.net/Jekin_KE/article/details/87953583