先看這段代碼,有個詭異的問題,不確定是不是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){//這里一直為0Debug.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。
只能先加載資源再加載場景了。