コード例 #1
0
        /// <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);
        }
コード例 #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>
        /// 场景加载结束
        /// </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);
        }