- 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
- }
- }