首页/ 第 16 章 · 性能优化/ 第 268 课
LESSON 268 · 性能优化

场景加载优化(异步)

场景加载优化完成。下一课做对象池实战。

⏱ 约 14 分钟📊 难度:入门🗂 第 16 章 · 性能优化📍 第 268 / 300 课
课程进度
268 / 300

🎯本节学习目标

  • 实现异步加载
  • 实现进度条
  • 实现 Loading 界面

🚀课程导读

“切场景白屏几秒”体验差。本课用异步加载+进度条让切换“顺滑”。

异步加载基础

LoadSceneAsync。

  1. 【同步问题】SceneManager.LoadScene 会卡主线程(大场景几秒白屏)。
  2. 【异步加载】SceneManager.LoadSceneAsync(“”Level2“”);
  3. 返回 AsyncOperation,后台加载不阻塞。
  4. 【基础用法】
  5. AsyncOperation op = SceneManager.LoadSceneAsync(“”Level2“”);
  6. 【进度】op.progress(0-0.9 实际加载,0.9-1 是激活)。
  7. 【激活】op.allowSceneActivation = false:加载完不自动切,等我们手动。
  8. 【完整】“加载完→手动激活→切场景”。
  9. 【注意】异步加载中场景还没切换,别放玩家乱走。
  10. 【完成】异步“通了”!
💡
异步加载 = LoadSceneAsync + allowSceneActivation 控制 + 完成手动激活。三步。

Loading 界面与进度条

“转圈圈”给反馈。

  1. 【Loading 界面】Canvas:进度条(Slider/Image Filled)+ 提示文字。
  2. 【脚本 LoadManager】
  3. public Slider progressBar;
  4. public TMP_Text tipText;
  5. public void LoadLevel(string sceneName) {
  6. StartCoroutine(LoadAsync(sceneName));
  7. }
  8. IEnumerator LoadAsync(string sceneName) {
  9. gameObject.SetActive(true); // 显示 Loading
  10. AsyncOperation op = SceneManager.LoadSceneAsync(sceneName);
  11. op.allowSceneActivation = false;
  12. while (!op.isDone) {
  13. float p = Mathf.Clamp01(op.progress / 0.9f);
  14. progressBar.value = p;
  15. // 可随机换加载提示
  16. yield return null;
  17. }
  18. op.allowSceneActivation = true; // 切场景
  19. }
  20. 【说明】progress 除以 0.9 映射到 0-1(因为 0.9 后是激活)。
  21. 【过渡动画】Loading 界面淡入淡出(第 159 课)。
  22. 【调用】到关卡入口:LoadManager.Instance.LoadLevel(“”Level2“”);
  23. 【完成】切场景“丝滑”!
  24. 【注意】Loading 界面要在“新场景”之外(DontDestroyOnLoad 或先显示)。
  25. 【进阶】场景预加载(提前 LoadSceneAsync 后台预载,进阶)。
Loading 三件套:显示面板 + 进度条(progress/0.9)+ 完成激活。切场景零卡顿。

常见错误与排查

错误:进度条到 90% 停住?
原因:allowSceneActivation=false 且没设 true
解决:进度 1 后设置 op.allowSceneActivation = true 激活场景。

动手练习

课后小任务(做出来才算真的学会)

  • 实现异步加载场景
  • 做 Loading 界面与进度条
  • 实现“继续”按钮激活

本节小结

场景加载优化完成。下一课做对象池实战。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课内存管理