【Unity】协程
协程在主线程执行,可以利用yield实现类似多线程/异步的操作
StartCoroutine
StartCoroutine("方法名");//无参数
StartCoroutine(fun(a));//有参数
StartCoroutine("方法名",argu);//有参数
StopCoroutine
yield
yield return null;//暂停等待下一帧继续执行
yield return 0;//同上
yield return new WaitForSeconds(秒);//暂停等待指定时间后继续执行
yield return StartCoroutine(“携程方法名”)//开启协程,嵌套协程
IEnumerator
协程的方法写在迭代器中
观察下面的代码,可知:
- yield return null 后的内容必须在update内容全部执行完成才能继续执行;
- 在update中开启协程(会开启多次),会陆续执行完全部协程的内容
- 在Start中开启协程,按帧执行完协程的内容
int time = 1;
IEnumerator Demo(int i){
Debug.Log(i+1);
yield return null;//暂停 1
Debug.Log(i-1);
yield return null;//暂停 2
Debug.Log(i+2);
yield return null;//暂停 3
Debug.Log(i-2);
}
//在update中开启协程
private void Update(){
if (time <= 5)
{
Debug.Log($"第{time++}帧");
Debug.Log("开始");
StartCoroutine(Demo(10));
Debug.Log("update");
}
}
//结果
//------第一帧(开启新协程)-----
// 开始
// 11(第一个协程)
// update
//------第二帧(开启新协程)-----
// 开始
// 11(第二个协程)
// update
// 9(第1个协程的第2句)
//------第三帧(开启新协程)-----
// 开始
// 11(第三个协程)
// update
// 9(第2个协程的第2句)
// 12(第1个协程的第3句)
//------第四帧(开启新协程)-----
// 开始
// 11(第4个协程)
// update
// 9(第3个协程的第2句)
// 12(第2个协程的第3句)
// 8(第1个协程的第4句) ----- 第1协程全部执行完
//------第五帧(开启新协程)-----
// 开始
// 11(第5个协程)
// update
// 9(第4个协程的第2句)
// 12(第3个协程的第3句)
// 8(第2个协程的第4句)----- 第2协程全部执行完
//------第六帧(不在开启新协程)-----
// 9(第5个协程的第2句)
// 12(第4个协程的第3句)
// 8(第3个协程的第4句)----- 第3协程全部执行完
//------第七帧(不在开启新协程)-----
// 12(第5个协程的第3句)
// 8(第4个协程的第4句)----- 第4协程全部执行完
//------第八帧(不在开启新协程)-----
// 8(第5个协程的第4句)----- 第5协程全部执行完
//在Start中开启协程
private void Start()
{
StartCoroutine(Demo(10));
}
private void Update()
{
if (time <= 6)
{
Debug.Log($"第{time++}帧");
Debug.Log("update");
}
}
//结果
// 11
//------第一帧-----
// update
//------第二帧-----
// update
// 9
//------第三帧-----
// update
// 12
//------第四帧-----
// update
// 8
//------第五帧-----
// update
//------第六帧-----
// update