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() { blackScreen = GameObject.FindWithTag("BlackScreen").GetComponent(); playerController = GameObject.FindWithTag("Player").GetComponent(); DialogueManager = GetComponent(); DialogueManager.ReloadReferences(); 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) { isTransitioningScenes = true; // Fade to black float fadeDuration = 0.2f; 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; if (playerController != null && GameSceneManager.Instance != null) { SceneDoor door = GameSceneManager.Instance.GetDoorWithId(doorId); if (door != null) { playerController.CharacterControllerMove(door.gameObject.transform.position - playerController.transform.position); playerController.DougBody.transform.rotation = door.gameObject.transform.rotation; } } // Fade back in while (fadeTime < fadeDuration) { blackScreenColor.a = Mathf.Lerp(1, 0, fadeTime / fadeDuration); blackScreen.color = blackScreenColor; fadeTime += Time.deltaTime; yield return null; } fadeTime = 0; isTransitioningScenes = false; } /// /// Are we currently in the middle of a scene transition? /// public bool InSceneTransition() { return 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; }