U
Unity
星辰学院
首页
课程表
章节导览
第 1 课
返回主站
首页
/
第 16 章 · 性能优化
/
第 268 课
LESSON 268 · 性能优化
场景加载优化(异步)
场景加载优化完成。下一课做对象池实战。
⏱ 约 14 分钟
📊 难度:
入门
🗂 第 16 章 · 性能优化
📍 第 268 / 300 课
课程进度
268 / 300
🎯
本节学习目标
实现异步加载
实现进度条
实现 Loading 界面
🚀
课程导读
“切场景白屏几秒”体验差。本课用异步加载+进度条让切换“顺滑”。
◆
异步加载基础
LoadSceneAsync。
【同步问题】SceneManager.LoadScene 会卡主线程(大场景几秒白屏)。
【异步加载】SceneManager.LoadSceneAsync(“”Level2“”);
返回 AsyncOperation,后台加载不阻塞。
【基础用法】
AsyncOperation op = SceneManager.LoadSceneAsync(“”Level2“”);
【进度】op.progress(0-0.9 实际加载,0.9-1 是激活)。
【激活】op.allowSceneActivation = false:加载完不自动切,等我们手动。
【完整】“加载完→手动激活→切场景”。
【注意】异步加载中场景还没切换,别放玩家乱走。
【完成】异步“通了”!
💡
异步加载 = LoadSceneAsync + allowSceneActivation 控制 + 完成手动激活。三步。
◆
Loading 界面与进度条
“转圈圈”给反馈。
【Loading 界面】Canvas:进度条(Slider/Image Filled)+ 提示文字。
【脚本 LoadManager】
public Slider progressBar;
public TMP_Text tipText;
public void LoadLevel(string sceneName) {
StartCoroutine(LoadAsync(sceneName));
}
IEnumerator LoadAsync(string sceneName) {
gameObject.SetActive(true); // 显示 Loading
AsyncOperation op = SceneManager.LoadSceneAsync(sceneName);
op.allowSceneActivation = false;
while (!op.isDone) {
float p = Mathf.Clamp01(op.progress / 0.9f);
progressBar.value = p;
// 可随机换加载提示
yield return null;
}
op.allowSceneActivation = true; // 切场景
}
【说明】progress 除以 0.9 映射到 0-1(因为 0.9 后是激活)。
【过渡动画】Loading 界面淡入淡出(第 159 课)。
【调用】到关卡入口:LoadManager.Instance.LoadLevel(“”Level2“”);
【完成】切场景“丝滑”!
【注意】Loading 界面要在“新场景”之外(DontDestroyOnLoad 或先显示)。
【进阶】场景预加载(提前 LoadSceneAsync 后台预载,进阶)。
✅
Loading 三件套:显示面板 + 进度条(progress/0.9)+ 完成激活。切场景零卡顿。
⚠
常见错误与排查
⛔
错误:
进度条到 90% 停住?
原因:
allowSceneActivation=false 且没设 true
解决:
进度 1 后设置 op.allowSceneActivation = true 激活场景。
★
动手练习
课后小任务(做出来才算真的学会)
实现异步加载场景
做 Loading 界面与进度条
实现“继续”按钮激活
✓
本节小结
场景加载优化完成。下一课做对象池实战。
标记为已完成
完成打卡后,主站会实时更新你的学习进度 🎯
← 上一课
内存管理
下一课 →
对象池实战(完整系统)
↑