using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameStateManager : MonoBehaviour { public static GameStateManager Instace{ get; private set; } public event EventHandler OnStateChanged; public event EventHandler OnGamePaused; public event EventHandler OnGameUnpaused; private enum State { WaitingToStart, StartingCountdown, GamePlaying, GameOver, } private State state; private bool isGamePaused = false; // --- Timers --- private float countdownToStartTimer = 3f; private float gamePlayTimer; private float gamePlayTimerMax = 60f; private void Awake() { state = State.WaitingToStart; Instace = this; } private void Start() { GameInput.Instance.OnPauseAction += GameInput_OnPauseAction; GameInput.Instance.OnInteractAction += GameInput_OnInteractAction; } private void GameInput_OnInteractAction(object sender, EventArgs e) { if (state == State.WaitingToStart) { state = State.StartingCountdown; OnStateChanged?.Invoke(this, EventArgs.Empty); } } private void GameInput_OnPauseAction(object sender, EventArgs e) { TogglePauseGame(); } private void Update() { switch (state) { case State.WaitingToStart: break; case State.StartingCountdown: countdownToStartTimer -= Time.deltaTime; if (countdownToStartTimer < 0f) { state = State.GamePlaying; gamePlayTimer = gamePlayTimerMax; OnStateChanged?.Invoke(this, EventArgs.Empty); } break; case State.GamePlaying: gamePlayTimer -= Time.deltaTime; if (gamePlayTimer < 0f) { state = State.GameOver; OnStateChanged?.Invoke(this, EventArgs.Empty); } break; case State.GameOver: break; } } public bool IsGamePlaying() { return state == State.GamePlaying; } public bool IsCountdownToStartActive() { return state == State.StartingCountdown; } public bool IsGameOver() { return state == State.GameOver; } public float GetCountdownToStartTimer() { return countdownToStartTimer; } public float GetGamePlayingTimerNomalized() { return gamePlayTimer / gamePlayTimerMax; } public void TogglePauseGame() { isGamePaused = !isGamePaused; if (isGamePaused) { Time.timeScale = 0f; OnGamePaused?.Invoke(this, EventArgs.Empty); } else { Time.timeScale = 1f; OnGameUnpaused?.Invoke(this, EventArgs.Empty); } } }