void Start() { #if UNITY_EDITOR #else //运行时,需要手动调用 BeforeSceneLoad.ColdBind(); #endif Jyx2_UIManager.Instance.GameStart(); }
/// <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; }