一、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 后面可以接几种值:
- yield return + “int类型的值”。指当前暂停一帧,从下一帧继续开始执行。
- yield return + “协程”。yield return 后面可以跟一个协程,当执行到该行代码的时候执行其后面的协程,如果下面还有代码在执行完yield return 后面的协程时候,回来继续执行。例如:yield return StartCoroutine(xxx());
- yield return new WaitForSeconds(时间)。这主要是等待几秒钟后执行再yield return 后面的代码。
- 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官网中查看对应的官方解释。