private static void LoadSceneDoor(SceneDoorDetails doorDetails) { if (battleScene != null || tradeScene != null || evolutionScene != null || playerMenuScene != null) { Debug.LogError("Attempting to load scene whilst in battle/trade/evolution/player menu scene"); return; } Scene oldScene = CurrentScene; GetFreeRoamSceneController(oldScene).SetDoorsEnabledState(false); GetFreeRoamSceneController(oldScene).SetSceneRunningState(false); StartFadeOut(); FadeOutComplete += () => { PlayerController.singleton.SetMoveDelay(sceneChangePlayerMoveDelay); if (doorDetails.isDepthLevel) { AddSceneDoorToRecordStack(oldScene.name, doorDetails); } currentInstanceId = doorDetails.instanceId; LoadScene(doorDetails.sceneName, oldScene, doorDetails.newSceneTargetPosition); }; }
public override SceneDoorDetails GetInstanceSpecificSceneDoorDetails(SceneDoorDetails baseDoorDetails) => new SceneDoorDetails() { isDepthLevel = baseDoorDetails.isDepthLevel, isLoadingDoor = baseDoorDetails.isLoadingDoor, newSceneTargetPosition = baseDoorDetails.newSceneTargetPosition, returnPosition = Vector2Int.RoundToInt(door.transform.position) + Vector2Int.down, sceneName = baseDoorDetails.sceneName, instanceId = baseDoorDetails.instanceId };
private static void LoadScene(SceneDoorDetails doorDetails) { if (doorDetails.isDepthLevel) { LoadDepthLevelScene(doorDetails); } else { LoadParallelLevelScene(doorDetails); } }
public static void UseDoor(SceneDoorDetails doorDetails) { if (doorDetails.isLoadingDoor) { LoadSceneDoor(doorDetails); } else { AscendScene(); } }
public static void UseDoor(SceneDoorDetails doorDetails) { RefreshCurrentSceneStack(); if (doorDetails.isLoadingDoor) { LoadScene(doorDetails); } else { ExitDepthLevelScene(); } }
private static void LoadParallelLevelScene(SceneDoorDetails doorDetails) { if (battleSceneInUse) { Debug.LogError("Attempting to load scene whilst in battle"); return; } Scene oldScene = sceneRecordStack.Pop().scene; GetFreeRoamSceneController(oldScene).SetDoorsEnabledState(false); GetFreeRoamSceneController(oldScene).SetSceneRunningState(false); StartFadeOut(); FadeOutComplete += () => { GetFreeRoamSceneController(oldScene).SetSceneRunningState(true); GetFreeRoamSceneController(oldScene).SetEnabledState(false); PlayerGameObject.GetComponent <PlayerController>().SetMoveDelay(sceneChangePlayerMoveDelay); //https://low-scope.com/unity-quick-get-a-reference-to-a-newly-loaded-scene/ int newSceneIndex = SceneManager.sceneCount; AsyncOperation loadSceneOperation = SceneManager.LoadSceneAsync(doorDetails.sceneName, LoadSceneMode.Additive); loadSceneOperation.completed += (ao) => { Scene newScene = SceneManager.GetSceneAt(newSceneIndex); sceneRecordStack.Push(new SceneRecord(newScene)); MovePlayerAndMenuToNewScene(PlayerGameObject, FreeRoamMenuGameObject, newScene, doorDetails.newSceneTargetPosition); SceneManager.SetActiveScene(newScene); GetFreeRoamSceneController(newScene).SetSceneRunningState(false); SceneManager.UnloadSceneAsync(oldScene).completed += (ao) => { GetFreeRoamSceneController(newScene).SetSceneRunningState(true); GetFreeRoamSceneController(newScene).SetDoorsEnabledState(true); StartFadeIn(); }; }; }; }
/// <summary> /// Gets an instance-specific SceneDoorDetails for a specific building instance by setting the instance-specific properties of it (eg. the return position) /// </summary> /// <param name="baseDetails">The basic door details to base the output on</param> public abstract SceneDoorDetails GetInstanceSpecificSceneDoorDetails(SceneDoorDetails baseDoorDetails);
private static void AddSceneDoorToRecordStack(string sceneIdentifier, SceneDoorDetails doorDetails) => sceneRecordStack.Push(new SceneRecord(sceneIdentifier, doorDetails.returnPosition, doorDetails.instanceId));