// 开始异步加载场景 // sceneName: 下一场景名 // bundleName: 要同时加载的bundle名字 // loadingSceneCallback: 完成加载Loading场景后的回调 // nextSceneInitWork: 下一场景预加载函数,会将预加载数据存储到_nextSceneData,函数调用的时候立刻执行 // nextSceneHandleData: 下一场景加载完成后取回预加载数据的回调函数 // forceLoad: 跳过Loading场景,直接加载下一场景 public void LoadSceneAsync(string sceneName, bool dontDestroy = false, NextSceneCallback nextSceneHandleData = null) { if (_isLoading) { return; } _isLoading = true; var currentScene = SceneManager.GetActiveScene().name; if (!currentScene.Equals(LoadingScene)) { _dontDestroy = dontDestroy; _lastScene = currentScene; _nextScene = sceneName; _bundleName = sceneName; if (_currentSceneEndCallback != null) { _currentSceneEndCallback(); _currentSceneEndCallback = null; } _loadPageComplete = true; AddNextSceneHandler(nextSceneHandleData); StartLoadLoadingScene(); } }
IEnumerator LoadNextScene(AsyncOperation ao, float startTime) { while (true) { if (_progress < 1f) { // ao.progress到0.9就卡住了,所以大约在0.8之前读取ao.progress,之后模拟进度直到100% float threshold = .8f; if (_progress < threshold) { RefreshProgress(ao.progress); } else { RefreshProgress(1f); } yield return(null); } else { if (!_dontDestroy) { PageManager.Instance.DestroyCurrentPages(); } yield return(null); if (_nextSceneHandleData != null) { _nextSceneHandleData(); _nextSceneHandleData = null; } while (!_loadPageComplete) { yield return(null); } ao.allowSceneActivation = true; while (SceneManager.GetActiveScene().name == LoadingScene) { yield return(null); } Resources.UnloadUnusedAssets(); System.GC.Collect(); GeneralUIManager.RefreshSortingOrder(); _isLoading = false; break; } } }
public void LoadSceneAsyncAndOpenPage(string sceneName, string pageName, bool dontDestroy = false, Action finishCallback = null, NextSceneCallback nextSceneHandleData = null) { if (_isLoading) { return; } nextSceneHandleData += delegate { finishCallback += LoadPageCompleteCallback; PageManager.Instance.OpenPage(pageName, dontDestroy, finishCallback, true); }; LoadSceneAsync(sceneName, dontDestroy, nextSceneHandleData); PageManager.State = PageManager.CommandState.WaitingForCommand; _loadPageComplete = false; }
public void RemoveNextSceneHandler(NextSceneCallback handler) { _nextSceneHandleData -= handler; }
public void AddNextSceneHandler(NextSceneCallback handler) { _nextSceneHandleData += handler; }