示例#1
0
    // 开始异步加载场景
    // 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();
        }
    }
示例#2
0
    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;
            }
        }
    }
示例#3
0
    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;
    }
示例#4
0
 public void RemoveNextSceneHandler(NextSceneCallback handler)
 {
     _nextSceneHandleData -= handler;
 }
示例#5
0
 public void AddNextSceneHandler(NextSceneCallback handler)
 {
     _nextSceneHandleData += handler;
 }