Newer
Older
TheVengeance-Project-IADE-Unity2D / Assets / Scripts / Managers / GameStateManager.cs
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.SceneManagement;
  6. namespace MyCollections.Managers
  7. {
  8. public class GameStateManager : MonoBehaviour
  9. {
  10. private static GameStateManager instance;
  11. private AudioManager audioManager;
  12. private GameState currentState;
  13. private GameState previousState;
  14. //List of active combat states
  15. private HashSet<CombatState> activeCombatStates = new HashSet<CombatState>();
  16. public int ActiveCombatStates => activeCombatStates.Count;
  17. public delegate void GameStateChangeHandler(GameState newState);
  18. public event GameStateChangeHandler OnGameStateChange; //Triggers when Game State Changes
  19. public event Action OnCombatExit; // Trigger when player leaves combat
  20. public GameState PreviousState => previousState;
  21. public GameState CurrentState => currentState;
  22. public static GameStateManager Instance => instance;
  23. private void Awake()
  24. {
  25. if (instance != null && instance != this)
  26. {
  27. Destroy(gameObject);
  28. }
  29. else
  30. {
  31. instance = this;
  32. DontDestroyOnLoad(gameObject);
  33. }
  34. audioManager = AudioManager.Instance;
  35. }
  36. // Start is called before the first frame update
  37. void Start()
  38. {
  39. SetState(GameState.Normal);
  40. SceneManager.activeSceneChanged += OnActiveSceneChanged;
  41. }
  42. private void Update()
  43. {
  44. //Debug.Log("Active Combat States" + activeCombatStates.Count);
  45. }
  46. // Changes the game state and triggers the event
  47. public void SetState(GameState state)
  48. {
  49. //Saves the current state
  50. previousState = currentState;
  51. if (currentState != state)
  52. {
  53. currentState = state;
  54. Debug.Log($"CURRENT GAME STATE: {currentState}");
  55. OnGameStateChange?.Invoke(currentState);
  56. }
  57. }
  58. //Adds a combat state to the List
  59. public void AddCombatState(CombatState combat)
  60. {
  61. activeCombatStates.Add(combat);
  62. if (currentState != GameState.Combat)
  63. {
  64. Debug.Log($"Active Combat States: {ActiveCombatStates}");
  65. EnterCombatState(); //Enters in Combat State
  66. }
  67. }
  68. //Remove a combat state when it's finished
  69. public void RemoveCombatState(CombatState combat)
  70. {
  71. activeCombatStates.Remove(combat);
  72. Debug.Log($"Active Combat States: {ActiveCombatStates}");
  73. EndGameCombatState();
  74. }
  75. //Checks if the Combat Game State is finished
  76. private void EndGameCombatState()
  77. {
  78. if (activeCombatStates.Count != 0) return;
  79. OnCombatExit?.Invoke(); // Trigger combat exit event
  80. SetState(GameState.Normal);
  81. }
  82. // Enters combat state
  83. private void EnterCombatState()
  84. {
  85. SetState(GameState.Combat);
  86. }
  87. // Pauses the game
  88. public void PauseGame()
  89. {
  90. SetState(GameState.Paused);
  91. Time.timeScale = 0f; // Pause the game
  92. }
  93. // Resumes the game
  94. public void ResumeGame()
  95. {
  96. SetState(previousState); // Or other states as needed
  97. Time.timeScale = 1f; // Resume the game
  98. }
  99. private void OnActiveSceneChanged(Scene current, Scene next)
  100. {
  101. Debug.Log($"Scene changed from {current.name} to {next.name}");
  102. // You can trigger your custom game state change event here if necessary
  103. OnGameStateChange?.Invoke(GameState.Normal);
  104. }
  105. }
  106. public enum GameState
  107. {
  108. Paused,
  109. Combat,
  110. Normal,
  111. InDialogue,
  112. Loading,
  113. Cutscene
  114. }
  115. }