You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:38:48