Exemple #1
0
    void Start()
    {
#if UNITY_EDITOR
#else
        //运行时,需要手动调用
        BeforeSceneLoad.ColdBind();
#endif
        Jyx2_UIManager.Instance.GameStart();
    }
Exemple #2
0
        /// <summary>
        /// Switches the active scene, loads the connected scenes as defined by worldGraph, and unloads all other currently loaded scenes.
        /// </summary>
        /// <param name="levelName">Name of the scene to become active</param>
        /// <param name="playBanner">Whether or not to play the LevelBanner. Defaults to true.</param>
        /// <param name="saveDeactivatedScenesToDisk">Whether or not to save any scenes that deactivated to disk. Defaults to true</param>
        /// <param name="loadActivatedScenesFromDisk">Whether or not to load any scenes from disk that become activated. Defaults to true</param>
        /// <param name="checkActiveSceneName">If true, will skip loading the scene if it's already the active scene. False will force it to load the scene. Defaults to true.</param>
        async void SwitchActiveSceneNow(
            string levelName,
            bool playBanner = true,
            bool saveDeactivatedScenesToDisk = true,
            bool loadActivatedScenesFromDisk = true,
            bool checkActiveSceneName        = true
            )
        {
            if (!levels.ContainsKey(levelName))
            {
                debug.LogError("No level name found in world graph with name " + levelName);
                return;
            }

            if (checkActiveSceneName && activeSceneName == levelName)
            {
                debug.LogWarning("Level " + levelName + " already the active scene.");
                return;
            }

            isCurrentlySwitchingScenes = true;
            // Immediately turn on the loading icon instead of waiting for a frame into the loading
            LoadingIcon.instance.state = LoadingIcon.State.Loading;

            Debug.Log($"Switching to level {levelName}");

            BeforeActiveSceneChange?.Invoke(levelName);

            activeSceneName = levelName;

            if (playBanner)
            {
                LevelChangeBanner.instance.PlayBanner(enumToSceneName[activeSceneName]);
            }

            // First unload any scene no longer needed
            DeactivateUnrelatedScenes(levelName, saveDeactivatedScenesToDisk);

            List <string> scenesToBeLoadedFromDisk = new List <string>();

            // Then load the level if it's not already loaded
            if (!(loadedSceneNames.Contains(levelName) || currentlyLoadingSceneNames.Contains(levelName)))
            {
                currentlyLoadingSceneNames.Add(levelName);

                BeforeSceneLoad?.Invoke(levelName);

                scenesToBeLoadedFromDisk.Add(levelName);
                if (ShouldLoadScene(levelName))
                {
                    SceneManager.LoadSceneAsync(levelName, LoadSceneMode.Additive);
                }
            }
            else
            {
                if (!hasLoadedDefaultPlayerPosition)
                {
                    LoadDefaultPlayerPosition();
                }
            }

            // Then load the adjacent scenes if they're not already loaded
            var connectedSceneNames = levels[levelName].connectedLevels.Select(l => enumToSceneName[l]);

            foreach (string connectedSceneName in connectedSceneNames)
            {
                if (!(loadedSceneNames.Contains(connectedSceneName) ||
                      currentlyLoadingSceneNames.Contains(connectedSceneName)))
                {
                    currentlyLoadingSceneNames.Add(connectedSceneName);

                    BeforeSceneLoad?.Invoke(connectedSceneName);

                    scenesToBeLoadedFromDisk.Add(connectedSceneName);
                    if (ShouldLoadScene(connectedSceneName))
                    {
                        SceneManager.LoadSceneAsync(connectedSceneName, LoadSceneMode.Additive);
                    }
                }
            }

            debug.Log("Waiting for scenes to be loaded...");
            await TaskEx.WaitUntil(() => !LevelManager.instance.IsCurrentlyLoadingScenes);

            debug.Log("All scenes loaded into memory" + (loadActivatedScenesFromDisk ? ", loading save..." : "."));

            if (loadActivatedScenesFromDisk && scenesToBeLoadedFromDisk.Count > 0)
            {
                foreach (string sceneToBeLoaded in scenesToBeLoadedFromDisk)
                {
                    BeforeSceneRestoreDynamicObjects?.Invoke(sceneToBeLoaded);
                }

                foreach (string sceneToBeLoaded in scenesToBeLoadedFromDisk)
                {
                    SaveManagerForScene saveManagerForScene = SaveManager.GetOrCreateSaveManagerForScene(sceneToBeLoaded);
                    saveManagerForScene.RestoreDynamicObjectStateForScene();
                }

                foreach (string sceneToBeLoaded in scenesToBeLoadedFromDisk)
                {
                    BeforeSceneRestoreState?.Invoke(sceneToBeLoaded);
                }

                foreach (string sceneToBeLoaded in scenesToBeLoadedFromDisk)
                {
                    SaveManagerForScene saveManagerForScene = SaveManager.GetOrCreateSaveManagerForScene(sceneToBeLoaded);
                    saveManagerForScene.RestoreSaveableObjectStateForScene();
                }

                foreach (string sceneToBeLoaded in scenesToBeLoadedFromDisk)
                {
                    AfterSceneRestoreState?.Invoke(sceneToBeLoaded);
                }
            }

            isCurrentlySwitchingScenes = false;
        }