一.协程的概念:
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方法中使用协程,否则会报错。