什么是协程?
在Unity主线程运行时,开启另外一段逻辑来协助当前程序的执行,即协程。
协程与线程、进程不同,协程的上下文切换是由程序员决定的,在开启协程后可以暂停协程执行,暂停之后会返回主函数(开启协程所在的函数),执行主函数剩余的部分,直到中断指令完成后,从中断指令的下一行继续执行协程函数的剩余部分,函数体执行完,协程即结束
创建一个协程
IEnumerator Test(int i)
{
}
开启协程
StartCoroutine(函数名(参数列表))
StartCoroutine("函数名",参数列表)
//StartCoroutine(函数名(参数列表))
StartCoroutine(Test(1));
//StartCoroutine("函数名",参数列表)
StartCoroutine("Test",1);
暂停协程
//关闭指定协程
StopCoroutine(函数名(参数列表))
StopCoroutine(“函数名”,参数列表)
//关闭所有协程
StopAllCoroutines()
关闭协程的方式一定要与关闭协程的方式一致
//StopCoroutine(函数名(参数列表))
StopCoroutine(Test(1));
//StopCoroutine(“函数名”,参数列表)
StopCoroutine("Test",1);
//关闭所有协程
StopAllCoroutines()
yield关键字
yield return null或yield return 数字 //协程将在下一帧所有脚本的update执行完后继续执行
yield return new WaitForSeconds(float time)//协程在延迟指定时间后且当前帧所有脚本的update全部执行完后才会继续执行 且当timescale=0,是不会执行
yield return new WaitForFixedUpdate() //协程在所有脚本的fixedupdate执行完后,再继续执行
yield return WWW("地址") //协程在www下载资源完成后,再继续执行
yield return StartCoroutine(协程) //协程在指定协程结束后,再继续执行
yield return WaitForSecondsRealtime //协程在延迟指定时间,且当前帧所有脚本的update全部执行后才会继续执行,不受时间缩放影响
void Start()
{
StartCoroutine(Test());
Debug.Log(Time.time);
}
void FixedUpdate()
{
Debug.Log("UPdate");
}
IEnumerator Test()
{
yield return new WaitForSeconds(1f);//延时1s后继续执行
Debug.Log(string.Format("===>{0} time:{1}", 1, Time.time));
yield return new WaitForFixedUpdate();//协程在所有脚本的fixedupdate执行完后,再继续执行
Debug.Log(string.Format("===>{0} time:{1}", 2, Time.time));
}
折叠看 程序结果
可以看到俩个红色三角的时间间隔约为1s这是“ yield return new WaitForSeconds(1f);”的原因
//延时1s后继续执行
展开看程序结果
可以看出“ yield return new WaitForFixedUpdate();//当前帧所有Fixedupdate执行完后执行”