【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
posted @ 2024-10-21 09:20  Sitar  阅读(2)  评论(0编辑  收藏  举报