using System.Collections; using System.Collections.Generic; using TMPro; using Unity.VectorGraphics; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; public class GameManager : MonoBehaviour { public static GameManager Instance { get; private set; } public DialogueManager DialogueManager { get; private set; } public TimeManager TimeManager { get; private set; } public PlayerManager PlayerManager { get; private set; } public Inventory Inventory { get; private set; } public Storybools Storybools { get; private set; } public MenuController MenuController { get; private set; } public SoundSettingManager SoundSettingManager { get; private set; } public PlayerController PlayerController { get; private set; } public Image BlackScreen { get; private set; } // Are we currently in a scene transition? private bool isTransitioningScenes = false; private void Awake() { // If there is an instance, and it's not me, delete myself. if (Instance != null && Instance != this) { Destroy(this.gameObject); return; } else { Instance = this; } DontDestroyOnLoad(gameObject); ReloadReferences(); } private void Start() { SaveSystem.Load(); } /// /// Grab everything the GameManager needs to keep track of /// private void ReloadReferences() { Instance.BlackScreen = GameObject.FindWithTag("BlackScreen").GetComponent(); Instance.PlayerController = GameObject.FindWithTag("Player").GetComponent(); Instance.DialogueManager = GetComponent(); Instance.DialogueManager.ReloadReferences(); Instance.Inventory = GetComponent(); Instance.TimeManager = GetComponent(); Instance.PlayerManager = GetComponent(); Instance.SoundSettingManager = GetComponent(); Instance.SoundSettingManager.ReloadReferences(); Instance.MenuController = GameObject.FindWithTag("MenuController").GetComponent(); Instance.MenuController.HideAllScreens(); } #region Map Load Handling /// /// Triggers transition to a map point /// public void GoToMapPoint(MapPoint mapPoint, bool instantBlackScreen = false) { StartCoroutine(GoToMapPointCoroutine(mapPoint, instantBlackScreen)); } /// /// Executes transition to map point (scene and location) /// private IEnumerator GoToMapPointCoroutine(MapPoint mapPoint, bool instantBlackScreen) { Instance.isTransitioningScenes = true; Instance.PlayerController.SetCharacterControl(false); // Fade to black float fadeDuration = 0.2f; // how long to fade to/from black float moveDuration = 0.4f; // how long to auto walk into room from the door float fadeTime = 0; Color blackScreenColor = Color.black; // Fade to black when instantBlackScreen is false if (!instantBlackScreen) { while (fadeTime < fadeDuration) { blackScreenColor.a = Mathf.Lerp(0, 1, fadeTime / fadeDuration); Instance.BlackScreen.color = blackScreenColor; fadeTime += Time.deltaTime; yield return null; } fadeTime = 0; } else { // instantly make screen black before scene transition blackScreenColor.a = 1; Instance.BlackScreen.color = blackScreenColor; } AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(mapPoint.Scene); while (!asyncLoad.isDone) { // Optional: Update a loading bar with asyncLoad.progress yield return null; } ReloadReferences(); // Make sure screen is black in new scene Instance.BlackScreen.color = blackScreenColor; if (Instance.PlayerController != null && GameSceneManager.Instance != null) { Instance.PlayerController.CharacterControllerMove(mapPoint.SpawnPosition - PlayerController.transform.position); } // Fade back in while (fadeTime < fadeDuration) { blackScreenColor.a = Mathf.Lerp(1, 0, fadeTime / fadeDuration); Instance.BlackScreen.color = blackScreenColor; fadeTime += Time.deltaTime; yield return null; } blackScreenColor.a = 0; Instance.BlackScreen.color = blackScreenColor; // move character a little more while (fadeTime < moveDuration) { fadeTime += Time.deltaTime; yield return null; } fadeTime = 0; Instance.isTransitioningScenes = false; Instance.PlayerController.SetCharacterControl(true); } #endregion #region Scene Door Handling /// /// Triggers transition to specified scene at the door with the specified ID /// public void EnterSceneDoor(string scene, int door) { StartCoroutine(EnterSceneDoorCoroutine(scene, door)); } /// /// Executes transition to specified scene at the door with the specified ID /// private IEnumerator EnterSceneDoorCoroutine(string scene, int doorId) { Instance.isTransitioningScenes = true; Instance.PlayerController.SetCharacterControl(false); // Fade to black float fadeDuration = 0.2f; // how long to fade to/from black float moveDuration = 0.4f; // how long to auto walk into room from the door float fadeTime = 0; Color blackScreenColor = Color.black; while (fadeTime < fadeDuration) { blackScreenColor.a = Mathf.Lerp(0, 1, fadeTime / fadeDuration); Instance.BlackScreen.color = blackScreenColor; fadeTime += Time.deltaTime; yield return null; } fadeTime = 0; AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(scene); while (!asyncLoad.isDone) { // Optional: Update a loading bar with asyncLoad.progress yield return null; } ReloadReferences(); // Make sure screen is black in new scene blackScreenColor.a = 1; Instance.BlackScreen.color = blackScreenColor; SceneDoor door = GameSceneManager.Instance.GetDoorWithId(doorId); if (Instance.PlayerController != null && GameSceneManager.Instance != null) { if (door != null) { Instance.PlayerController.CharacterControllerMove(door.gameObject.transform.position - PlayerController.transform.position); Instance.PlayerController.DougBody.transform.rotation = door.gameObject.transform.rotation; } } // Fade back in while (fadeTime < fadeDuration) { blackScreenColor.a = Mathf.Lerp(1, 0, fadeTime / fadeDuration); Instance.BlackScreen.color = blackScreenColor; fadeTime += Time.deltaTime; Instance.PlayerController.WalkInDirection((door.WalkDirection.position - PlayerController.transform.position).normalized); yield return null; } blackScreenColor.a = 0; Instance.BlackScreen.color = blackScreenColor; // move character a little more while (fadeTime < moveDuration) { Instance.PlayerController.WalkInDirection((door.WalkDirection.position - PlayerController.transform.position).normalized); fadeTime += Time.deltaTime; yield return null; } fadeTime = 0; Instance.isTransitioningScenes = false; Instance.PlayerController.SetCharacterControl(true); } #endregion /// /// Are we currently in the middle of a scene transition? /// public bool InSceneTransition() { return Instance.isTransitioningScenes; } #region Storybool Save/Load public void SaveStoryBools(ref StoryboolSaveData data) { data.Storybools = Instance.Storybools; } public void LoadStoryBools(StoryboolSaveData data) { if (data.Storybools != null) { Instance.Storybools = data.Storybools; } else { Instance.Storybools = new Storybools(); } } #endregion } [System.Serializable] public struct StoryboolSaveData { public Storybools Storybools; }