AsyncOperation.allowSceneActivation导致异步加载卡死

发布于:2025-02-10 ⋅ 阅读:(51) ⋅ 点赞:(0)

先看这段代码,有个诡异的问题,不确定是不是bug

public class Test : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(LoadScene(Ego.LoadingLevel));
    }

    IEnumerator LoadScene(string sceneName)
    {
        LoadingUI.UpdateProgress(0.9f);
        yield return new WaitForSeconds(1f);
        var asyncOperation = SceneManager.LoadSceneAsync(sceneName);
        asyncOperation.allowSceneActivation = false;//设置加载完成后不能自动跳转场景
        while (!asyncOperation.isDone)
        {
            LoadingUI.UpdateProgress(0.9f);
            if (asyncOperation.progress == 0.9f)
            {
                Debug.Log("加载关卡完成");
                LoadSceneFinish();
                yield break;
            }
            yield return new WaitForEndOfFrame();
        }
    }

    [Button]
    void LoadSceneFinish()
    {
        StartCoroutine(LoadResource("Test"));
    }
    IEnumerator LoadResource(string url)
    {
        Debug.Log($"开始加载:{url}");
        var assetAsync = Resources.LoadAsync(url);
        assetAsync.completed+= delegate(AsyncOperation operation)
        {
            //这个事件也无法触发
            Debug.Log("加载完成");
        };
        while (!assetAsync.isDone)
        {
            //这里一直为0
            Debug.Log("Progress"+assetAsync.progress);
            yield return null;
        }
        Debug.Log("完成");
    }
}

我先加载了关卡,但是加载完毕不跳转,所以用asyncOperation.allowSceneActivation = false;进行不跳转,然后再次加载一个Resource下的资源,用异步Resources.LoadAsync的方式,一直发现进度为0没有更新,等了好久也是一样,而同样的代码在别的地方是好的。

而且如果使用Resources.Load是能直接加载成功的。

翻了下官方api解释:

AsyncOperation.allowSceneActivation

public bool allowSceneActivation ;

描述

允许在场景准备就绪后立即激活场景。

当与 LoadLevelAsync 和 LoadLevelAdditiveAsync 结合使用时,它允许您 延时场景的实际激活。(并卸载前一个场景)。

当 allowSceneActivation 设置为 false 时,进度将在 0.9 处停止。isDone 保持 false 状态。当 allowSceneActivation 设置为 true 时,isDone 可以完成。虽然 isDone 为 false,但 AsyncOperation 队列已停止。例如,如果 LoadSceneAsync.allowSceneActivation 设置为 false,并且另一个 AsyncOperation(例如 SceneManager.UnloadSceneAsync)已初始化,则在第一个 allowSceneActivation 设置为 true 之前不会调用最后一个操作。

也就是allowSceneActivation为false的话,其他的AsyncOperation也是卡住的。

这个不确定是不是unity的bug,太折腾人了。

对了,版本是Unity2020.3。

只能先加载资源再加载场景了。


网站公告

今日签到

点亮在社区的每一天
去签到