/// <summary> /// 卸载场景 /// </summary> /// <param name="pathOrAddress">资源地址</param> /// <param name="completeCallback">完成后回调</param> /// <param name="progressCallback">卸载进度 回调 </param> /// <param name="userData">自定义数据</param> public void UnloadSceneAsync(string pathOrAddress, OnSceneUnloadComplete completeCallback, OnSceneUnloadProgress progressCallback, SystemObject userData = null) { bool isSceneLoaded = m_LoadedSceneHandles.Any((sHandle) => { return(sHandle.PathOrAddress == pathOrAddress); }); if (!isSceneLoaded) { Debug.LogError($"SceneAssetLoader::UnloadSceneAsync->Scene not found.pathOrAddress={pathOrAddress}"); return; } SceneUnloadData unloadData = new SceneUnloadData(); unloadData.PathOrAddress = pathOrAddress; unloadData.CompleteCallback = completeCallback; unloadData.ProgressCallback = progressCallback; unloadData.UserData = userData; m_UnloadingSceneDatas.Add(unloadData); }
/// <summary> /// 开始卸载场景 /// </summary> /// <param name="unloadData"></param> private void SceneUnloadStart(SceneUnloadData unloadData) { SceneLoaderHandle loaderHandle = null; foreach (var handle in m_LoadedSceneHandles) { if (handle.PathOrAddress == unloadData.PathOrAddress) { loaderHandle = handle; break; } } unloadData.AsyncOperation = SceneManager.UnloadSceneAsync(loaderHandle.SceneName); }
/// <summary> /// 场景卸载结束 /// </summary> /// <param name="unloadData"></param> private void SceneUnloadComplete(SceneUnloadData unloadData) { SceneLoaderHandle loaderHandle = null; foreach (var handle in m_LoadedSceneHandles) { if (handle.PathOrAddress == unloadData.PathOrAddress) { loaderHandle = handle; break; } } m_LoadedSceneHandles.Remove(loaderHandle); m_AssetLoader.UnloadAsset(loaderHandle.PathOrAddress); unloadData.CompleteCallback?.Invoke(unloadData.PathOrAddress, unloadData.UserData); }
/// <summary> /// 在Update中检查场景加载与卸载 /// </summary> /// <param name="deltaTime"></param> internal void DoUpdate(float deltaTime) { if (m_LoadingSceneDatas.Count > 0) { SceneLoadData loadData = m_LoadingSceneDatas[0]; if (IsSceneLoadComplete(loadData)) { m_LoadingSceneDatas.RemoveAt(0); SceneLoadComplete(loadData); } else if (!loadData.IsLoading()) { SceneLoadStart(loadData); } else { SceneLoadProgress(loadData); } } //处理场景的卸载 if (m_UnloadingSceneDatas.Count > 0) { SceneUnloadData unloadData = m_UnloadingSceneDatas[0]; if (unloadData.IsDone()) { m_UnloadingSceneDatas.RemoveAt(0); SceneUnloadComplete(unloadData); } else if (unloadData.IsUnloading()) { unloadData.ProgressCallback?.Invoke(unloadData.PathOrAddress, unloadData.Progress(), unloadData.UserData); } else { SceneUnloadStart(unloadData); } } }