using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; namespace MyCollections.Managers { public class GameStateManager : MonoBehaviour { private static GameStateManager instance; private AudioManager audioManager; private GameState currentState; private GameState previousState; //List of active combat states private HashSet<CombatState> activeCombatStates = new HashSet<CombatState>(); public int ActiveCombatStates => activeCombatStates.Count; public delegate void GameStateChangeHandler(GameState newState); public event GameStateChangeHandler OnGameStateChange; //Triggers when Game State Changes public event Action OnCombatExit; // Trigger when player leaves combat public GameState PreviousState => previousState; public GameState CurrentState => currentState; public static GameStateManager Instance => instance; private void Awake() { if (instance != null && instance != this) { Destroy(gameObject); } else { instance = this; DontDestroyOnLoad(gameObject); } audioManager = AudioManager.Instance; } // Start is called before the first frame update void Start() { SetState(GameState.Normal); SceneManager.activeSceneChanged += OnActiveSceneChanged; } private void Update() { //Debug.Log("Active Combat States" + activeCombatStates.Count); } // Changes the game state and triggers the event public void SetState(GameState state) { //Saves the current state previousState = currentState; if (currentState != state) { currentState = state; Debug.Log($"CURRENT GAME STATE: {currentState}"); OnGameStateChange?.Invoke(currentState); } } //Adds a combat state to the List public void AddCombatState(CombatState combat) { activeCombatStates.Add(combat); if (currentState != GameState.Combat) { Debug.Log($"Active Combat States: {ActiveCombatStates}"); EnterCombatState(); //Enters in Combat State } } //Remove a combat state when it's finished public void RemoveCombatState(CombatState combat) { activeCombatStates.Remove(combat); Debug.Log($"Active Combat States: {ActiveCombatStates}"); EndGameCombatState(); } //Checks if the Combat Game State is finished private void EndGameCombatState() { if (activeCombatStates.Count != 0) return; OnCombatExit?.Invoke(); // Trigger combat exit event SetState(GameState.Normal); } // Enters combat state private void EnterCombatState() { SetState(GameState.Combat); } // Pauses the game public void PauseGame() { SetState(GameState.Paused); Time.timeScale = 0f; // Pause the game } // Resumes the game public void ResumeGame() { SetState(previousState); // Or other states as needed Time.timeScale = 1f; // Resume the game } private void OnActiveSceneChanged(Scene current, Scene next) { Debug.Log($"Scene changed from {current.name} to {next.name}"); // You can trigger your custom game state change event here if necessary OnGameStateChange?.Invoke(GameState.Normal); } } public enum GameState { Paused, Combat, Normal, InDialogue, Loading, Cutscene } }