在开始介绍Unity3D协程之前我先来剪刀区分下线程
线程:实现多个任务在同一时间内执行(实际是在很短的时间片内对个多个任务的执行来回切换,从而达到“同时的效果”),比较消耗系统资源
协程:实现一个任务在不同时间内分段执行,相对游戏来说系统开销不大
【协程的创建】
开启一个协程
//开启协程
//首先会调用下协程函数里面的内容
StartCoroutine(Caculator());
Caculator函数返回值是IEnumerator接口
IEnumerator Caculator()
{
for (int i = 0; i <= 5; i++)
{
Debug.Log("current value is:" + i);
yield return null;//等到下一帧开始继续运行
}
}
【常用的Coroutine操作】
IEnumerator Caculator()
{
for (int i = 0; i <= 5; i++)
{
Debug.Log("current value is:" + i);
yield return null;//等到下一帧开始继续运行
}
//yield return new WaitForEndOfFrame();//等到下一帧结束继续运行
//yield return new WaitForFixedUpdate();
//yield return new WaitForSeconds(2);//等2秒后继续运行,相当于一个定时器
//注意:运行到yield return 后该函数在这一帧停止运行,到指定时间后继续运行
}
【串联Coroutine操作】
在开发项目过程中,需要对多个协程任务串联(一个协程执行完后接着执行下一个协程)
IEnumerator SerialCoroutine()
{
//在协程中另外开启协程
yield return StartCoroutine(Caculator());//该协程运行完后将接着运行下一个协程
yield return StartCoroutine(TextCoroutine());
}
【实现原理】
实际相当于创建一个C#迭代器,将一段任务逻辑分解到迭代器中,也就自行地创建了一个Update(),每update执行一次迭代器
并且每次yield都会离开本次任务,迭代器会记住这个位置和上下文,从而使下一次update会在从上次离开位置进行执行
IEnumerator TextCoroutine()
{
Debug.Log("text1");
yield return null;
Debug.Log("text2");
yield return new WaitForSeconds(3);
Debug.Log("text3");
}