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 Inventory Inventory { get; private set; } public Storybools Storybools { get; private set; } // Are we currently in a scene transition? private bool isTransitioningScenes = false; private Image blackScreen; private PlayerController playerController; private void Awake() { // If there is an instance, and it's not me, delete myself. if (Instance != null && Instance != this) { Destroy(this.gameObject); } else { Instance = this; } DontDestroyOnLoad(gameObject); ReloadReferences(); SaveSystem.Load(); SaveSystem.Save(); // save off any corruption fixes } /// /// 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(); } /// /// 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); 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 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; } // 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); } /// /// 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; }