unity 协程
协程 ≠ 多线程:
Unity的协程完全运行在主线程上
没有创建新线程,也没有并行执行
本质是基于迭代器的分帧执行机制
unity主线程工作流程

yield 指令详解
- yield return null
意义:等待下一帧继续执行
工作原理:
csharp
IEnumerator Example() {
Debug.Log("第一帧开始");
yield return null; // 暂停,等待下一帧
Debug.Log("第二帧继续");
}
执行流程:
帧1:输出"第一帧开始",然后暂停
帧2:从yield return null后继续执行,输出"第二帧继续"
- yield break
意义:立即终止协程
类似:普通函数中的return
示例:
csharp
IEnumerator Example() {
if(skipProcess) yield break; // 立即退出
Debug.Log("不会执行到这里");
}
- yield return new WaitForSeconds(2.5f)
意义:等待指定时间
底层:Unity内部计时器
注意:受Time.timeScale影响
-
yield return new WaitForEndOfFrame()
意义:等待当前帧完全结束(渲染完成后) -
yield return StartCoroutine(OtherCoroutine())
意义:等待另一个协程完成
示例:
csharp
IEnumerator Main() {
yield return StartCoroutine(LoadAssets()); // 等待资源加载完成
StartGame();
}
- yield return new WaitUntil(() => player.IsReady)
意义:等待条件满足
动态条件:每帧检测lambda表达式
- yield return asyncOperation (如UnityWebRequest)
意义:等待异步操作完成
示例:
csharp
IEnumerator LoadData() {
UnityWebRequest req = UnityWebRequest.Get(url);
yield return req.SendWebRequest(); // 等待下载完成
Process(req.downloadHandler.text);
}
为什么需要协程
虽然协程在主线程顺序执行,但解决了关键问题:
问题 传统方法 协程方案
长时间操作 卡死主线程 分帧执行
异步等待 回调地狱 线性编码
顺序流程 状态机管理复杂 yield return 清晰表达
进度反馈 难以实现 每帧更新UI
典型应用场景:
游戏启动流程(如您的代码)
角色对话系统
过场动画序列
资源加载界面
网络请求处理
总结
协程在主线程:没有创建新线程
yield 是暂停点:不是跳转,而是"书签"
核心价值:
将长时间操作分帧执行
优雅处理异步工作流
保持代码可读性
Unity执行本质:

协程是Unity处理复杂时序逻辑的声明式解决方案,让开发者能用同步代码的风格编写异步逻辑,同时保证游戏流畅运行。
浙公网安备 33010602011771号