一.协程的概念:

1.协程是一个分部执行,遇到条件(yield return ……)会挂起,直到条件满足才能被唤醒,继续执行后边的代码。

2.Unity在每一帧都会处理对象上的协程。主要是在Updata后,去检查协程的条件是否被满足。

二.协程的写法

Unity的协程系统是基于C#的一个简单而强大的接口,IEnumerator允许你为自己的集合类型编写枚举器。也就是一个返回值,一个yield return null语句。

//不带参数的:
IEnumerator Parameter() 
{                        
    // 协程中必须有返回值yield return
    yield return null;
 }
//带参数的:
IEnumerator NoParameter(string name)
{
   print (name);
   yield return null;
 }

三.协程的启动与关闭

1.StartCoroutine();开始协程  

2.StopCoroutine(string methodName);停止协程   

3.StopAllCoroutines  停止运行此Behaviour上的所有协程

设置gameobject的active为false时可以终止协同程序,但是再次设置为true后协程不会再启动。

四.协程中注意事项

1.协程和普通方法一样,可以被多次调用。

2.协程一旦被开启之后,总是试图将方法中的代码执行完,之后停止。

3.在协程内,如果遇到yield return null,0,1……;表示剩余代码将在n秒之后执行。

4.在协程内遇到 yield return new WaitForSeconds(n);表示剩余代码将在n秒后执行。(受时间缩放的影响)

5.在协程中遇到 yield return StartCoroutine(Son()),表示剩余代码将在子协程执行完成之后举行执行(子协程仍然满足协程基本规则)。

6.在协程中如果遇到 yield return new WaitForFixedUpdate(),表示剩余代码将在FixedUpdate执行完毕之后继续向下执行。

7.在协程中如果遇到 yield return new WaitForEndOfFrame(),表示剩余代码将在ONGUI执行完毕之后继续向下执行。

8.在协程中如果遇到 yield return WWW,表示剩余代码将在www下载文件之后继续执行。

9.在协程中如果遇到 yield return obj,表示剩余代码将在obj不为空的时候继续向下执行。

10.协程方法,可以当做普通方法,在两个脚本之间自由调用。声明周期中的方法,也可以改造成协程方法。

11.当某一个脚本中的协程在执行过程中,如果我们将该脚本的enable设置为false,协程不会停止。只有将挂载该脚本的物体设置为SetActive(false)时才会停止,但是再次设置为true后协程不会再启动。

12.不能在Updata或者FixedUpdata方法中使用协程,否则会报错。