コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
 /// <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);
         }
     }
 }