Unity 2018.1场景加载进度条跳变问题:进度从0.01f跳至0.9f
问题:Unity场景加载进度条无法正确显示进度
我使用Unity 2018.1版本,切换场景时用Canvas里的Slider组件做加载进度条,但进度条只显示0.01f和0.9f,而且长时间停留在0.9f状态直到场景加载完成。请问为什么进度条没法正确显示加载进度,我的代码哪里有问题?
我的代码如下:
public GameObject logoScreen; public GameObject loadingScreen; public Slider loadingSlider; void Update () { // Logo Scene is Active if (logoScreen.activeInHierarchy == true) { // Debug.Log("Logo Active"); if (Input.GetMouseButtonDown(0)) { logoScreen.SetActive(false); LoadScene(1); } } } AsyncOperation async; public void LoadScene(int sceneNUM) { StartCoroutine(LoadingScreen(sceneNUM)); } IEnumerator LoadingScreen(int sceneNum) { loadingScreen.SetActive(true); async = SceneManager.LoadSceneAsync(sceneNum); async.allowSceneActivation = false; while (async.isDone == false) { loadingSlider.value = async.progress / 0.9f; if (async.progress == 0.9f) { loadingSlider.value = 1f; async.allowSceneActivation = true; } yield return null; } }
问题分析与解决办法
嘿,这个问题我之前也踩过坑,主要是对Unity的AsyncOperation机制理解有偏差,再加上代码里的几个小细节没处理好:
1. 先搞懂AsyncOperation.progress的特性
当你设置async.allowSceneActivation = false时,Unity的场景加载进度最多只会走到0.9——剩下的0.1是留给场景激活阶段的,这部分进度不会更新,直到你把allowSceneActivation设为true。所以进度停在0.9是Unity的正常机制,但你的代码处理逻辑不对。
2. 浮点数直接用==判断会踩精度坑
你代码里写了if (async.progress == 0.9f),但浮点数的精度问题会导致这个判断大概率不会触发!比如实际进度可能是0.8999999或者0.9000001,这时候==就匹配不上,进度条就一直卡在接近1的位置,直到场景加载完成才跳变。
3. 进度映射与场景激活时机冲突
你用async.progress / 0.9f把0-0.9的进度映射到0-1,这个思路是对的,但后面直接在进度到0.9时把slider设为1并激活场景,这时候场景还没完成最后阶段的加载,就会出现长时间停在0.9的视觉问题。
修正后的代码示例
public GameObject logoScreen; public GameObject loadingScreen; public Slider loadingSlider; void Update () { if (logoScreen.activeInHierarchy) { if (Input.GetMouseButtonDown(0)) { logoScreen.SetActive(false); LoadScene(1); } } } AsyncOperation async; public void LoadScene(int sceneNUM) { StartCoroutine(LoadingScreen(sceneNUM)); } IEnumerator LoadingScreen(int sceneNum) { loadingScreen.SetActive(true); async = SceneManager.LoadSceneAsync(sceneNum); async.allowSceneActivation = false; while (!async.isDone) { // 把0-0.9的进度映射到0-1,同时用Clamp01确保不会超出范围 float progress = Mathf.Clamp01(async.progress / 0.9f); loadingSlider.value = progress; // 用>=代替==,避免浮点数精度问题 if (async.progress >= 0.9f) { // 可以加个平滑过渡到1的动画,这里直接设为1也没问题 loadingSlider.value = 1f; // 等待场景完成最后加载阶段,再激活场景 yield return new WaitUntil(() => async.isDone); async.allowSceneActivation = true; } yield return null; } }
额外优化建议
- 如果想让进度条更平滑,可以用
Mathf.Lerp来逐步过渡slider的value,避免生硬跳变。 - 测试时尽量用一个资源较多的大场景,这样加载时间更长,能更清楚看到进度条的变化过程。
内容的提问来源于stack exchange,提问作者WokerHead
相关产品推荐
相关产品推荐

