协程
某一个方法让他分多次执行。
协程概念理解
- 与方法一样,协程也是一种程序组件。
- 相对一般方法而言,协程更加灵活,方法只有一个入口,而协程可以有多个入口和出口点,可以用协程来实现任何的方法,即使是Start也可以让它分多次完成。
- 协程更适合于用来实现如合作式多任务。
- 开始一个协程时,执行从被调用方法的起始处开始;然而,接下来的每次协程调用时,从协程返回(Yield return)的位置接着执行。
- 协程是单线程的。
协程的实现
Unity中协程实现(也叫迭代器),Unity中协程实现主要组成。
IEnumerator接口提供迭代。如果在Update、OnGUI等一直执行的方法中不要直接使用yield return ,因为它每帧执行,不会因为协程等一会,可以通过调用其他方法使用。但是尽量不要使用。
yield return xxxx指定下一次迭代入口(把XXXX换成下边WWW,null,0等)。
- WaitForFixedUpda在FixedUpdate后执行时候于物理控制,需要new。
- null、0、WaitForSenconds在每帧Update后执行适合于分多帧完成一个任务,如A*路径计算。
- WaitForEndOfFrame在每帧结束后执行,适合于每帧末尾执行的操作如相机的控制。
- WWW在请求结束后执行,适合于网络下载数据。
StartCoroutine 开启协程
publicclassTest01 : MonoBehaviour
{
privateIEnumerator Start()
{
print("第一次输出");
//yield return null;
yieldreturnnewWaitForSeconds(2);//等待执行,需要new
print("第二次输出");
//yield return null;
yieldreturnnewWaitForSeconds(2);
print("第三次输出");
}
}
publicclassTest01 : MonoBehaviour
{ //倒计时
privateint timeCount = 5;
privatevoid Start()
{
//协程方法不能直接调用
//方法一:StartCoroutine("TimeFunc");
StartCoroutine(TimeFunc());//方法二
}
privateIEnumerator TimeFunc()
{
do
{
print(timeCount);
yieldreturnnewWaitForSeconds(1);
timeCount -= 1;
} while (timeCount > 0);
//yield return new WaitForSeconds(3);
print("时间到");
}
}
协程的停止
StopCoroutine(string)
StopCoroutine(“协程方法名”) ,只能停止以StartCoroutine(“协程方法名”)开启的协程。
StopCoroutine() 停止本对像中开启的所有协程
使用协程的注意
- 在程序中调用StopCoroutine()方法只能终止以字符串形式启动(开始)的协程;
- 多个协程可以同时运行,他们会根据各自的启动顺序来更新
- 协程可以嵌套任意多层
- 如果你想让多个脚本访问一个协程,那么你可以定义静态的协程
- 协程不是多线程,他们运行在同一线程中,跟普通的脚本一样
- 如果你的程序需要大量的运算,那么可以考虑在一个随时间进行的协程中处理他们
- IEnumerator类型的方法不能带ref或out类型的参数
- 目前在Unity中没有简便的方法来检测作用于对象的协程数量以及具体是那些协程作用在对象上
协程执行顺序
开启协程,要想先把协程里的事情都干完再去执行下边代码,则需要在StartCoroutine 前加上yield return。若不加yield return,则会先执行完协程内一帧能干完的事情,再执行下边代码,再干协程内一帧干不完的事情。