unity 协程

协程 ≠ 多线程:

Unity的协程完全运行在主线程上

没有创建新线程,也没有并行执行

本质是基于迭代器的分帧执行机制

unity主线程工作流程
deepseek_mermaid_20250717_d1af02

yield 指令详解

  1. yield return null
    意义:等待下一帧继续执行

工作原理:

csharp

IEnumerator Example() {
    Debug.Log("第一帧开始");
    yield return null; // 暂停,等待下一帧
    Debug.Log("第二帧继续");
}

执行流程:

帧1:输出"第一帧开始",然后暂停

帧2:从yield return null后继续执行,输出"第二帧继续"

  1. yield break
    意义:立即终止协程

类似:普通函数中的return

示例:

csharp

IEnumerator Example() {
    if(skipProcess) yield break; // 立即退出
    Debug.Log("不会执行到这里");
}
  1. yield return new WaitForSeconds(2.5f)
    意义:等待指定时间

底层:Unity内部计时器

注意:受Time.timeScale影响

  1. yield return new WaitForEndOfFrame()
    意义:等待当前帧完全结束(渲染完成后)

  2. yield return StartCoroutine(OtherCoroutine())
    意义:等待另一个协程完成

示例:

csharp

IEnumerator Main() {
    yield return StartCoroutine(LoadAssets()); // 等待资源加载完成
    StartGame(); 
}
  1. yield return new WaitUntil(() => player.IsReady)
    意义:等待条件满足

动态条件:每帧检测lambda表达式

  1. 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执行本质:
deepseek_mermaid_20250717_c3b68a

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

posted @ 2025-07-17 12:09  木土无心  阅读(43)  评论(0)    收藏  举报