/// <summary> /// 加载场景 /// </summary> /// <param name="pathOrAddress">地址</param> /// <param name="completeCallback">完成后回调</param> /// <param name="progressCallback">加载进度回调</param> /// <param name="loadMode">场景加载模式</param> /// <param name="activateOnLoad">是否立即激活</param> /// <param name="userData">自定义数据</param> /// <returns></returns> public SceneLoaderHandle LoadSceneAsync(string pathOrAddress, OnSceneLoadComplete completeCallback, OnSceneLoadProgress progressCallback, LoadSceneMode loadMode = LoadSceneMode.Single, bool activateOnLoad = true, SystemObject userData = null) { bool isSceneLoaded = m_LoadedSceneHandles.Any((sHandle) => { return(sHandle.PathOrAddress == pathOrAddress); }); if (isSceneLoaded) { Debug.LogError($"SceneAssetLoader::LoadSceneAsync->Scene has been loaded.pathOrAddress={pathOrAddress}"); return(null); } bool isSceneLoading = m_LoadingSceneDatas.Any((loadData) => { return(loadData.PathOrAddress == pathOrAddress); }); if (isSceneLoading) { Debug.LogError($"SceneAssetLoader::LoadSceneAsync->Scene is in loading.pathOrAddress={pathOrAddress}"); return(null); } string assetPath = m_AssetLoader.GetAssetPath(pathOrAddress); string sceneName = Path.GetFileNameWithoutExtension(assetPath); SceneLoadData loaderData = new SceneLoadData(); loaderData.PathOrAddress = pathOrAddress; loaderData.AssetPath = assetPath; loaderData.CompleteCallback = completeCallback; loaderData.ProgressCallback = progressCallback; loaderData.LoadMode = loadMode; loaderData.ActivateOnLoad = activateOnLoad; loaderData.UserData = userData; SceneLoaderHandle handle = new SceneLoaderHandle(); handle.PathOrAddress = pathOrAddress; handle.AssetPath = assetPath; handle.SceneName = sceneName; loaderData.SceneHandle = handle; m_LoadingSceneDatas.Add(loaderData); return(handle); }
/// <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> /// 场景加载结束 /// </summary> /// <param name="loadData"></param> private void SceneLoadComplete(SceneLoadData loadData) { if (loadData.LoadMode == LoadSceneMode.Single) { foreach (var handle in m_LoadedSceneHandles) { m_AssetLoader.UnloadAsset(handle.PathOrAddress); } m_LoadedSceneHandles.Clear(); } SceneLoaderHandle loaderHandle = loadData.SceneHandle; Scene scene = SceneManager.GetSceneByName(loaderHandle.SceneName); loaderHandle.SetScene(scene); m_LoadedSceneHandles.Add(loaderHandle); loadData.CompleteCallback?.Invoke(loadData.PathOrAddress, scene, loadData.UserData); }