先看这段代码,有个诡异的问题,不确定是不是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。
只能先加载资源再加载场景了。