using System; using UnityEngine; public class KitchenGameManager : MonoBehaviour { public static KitchenGameManager Instance { get; private set; } public event EventHandler OnStateChanged; public event EventHandler OnGamePaused; public event EventHandler OnGameUnpaused; private enum State { WaitingToStart, CountdownToStart, GamePlaying, GameOver } private State state; private float waitingToStartTimer = 1f; private float countdownToStartTimer = 3f; private float gamePlayingTimer; private const float gamePlayingTimerMax = 10f; private bool isGamePaused; private void Awake() { Instance = this; state = State.WaitingToStart; gamePlayingTimer = gamePlayingTimerMax; } private void Start() => GameInput.Instance.OnPauseAction += GameInput_OnPauseAction; private void GameInput_OnPauseAction(object sender, EventArgs e) => TogglePauseGame(); private void TogglePauseGame() { isGamePaused = !isGamePaused; if (isGamePaused) { Time.timeScale = 0f; OnGamePaused?.Invoke(this, EventArgs.Empty); } else { Time.timeScale = 1f; OnGameUnpaused?.Invoke(this, EventArgs.Empty); } } private void Update() { switch (state) { case State.WaitingToStart: waitingToStartTimer -= Time.deltaTime; if (waitingToStartTimer > 0f) return; state = State.CountdownToStart; OnStateChanged?.Invoke(this, EventArgs.Empty); break; case State.CountdownToStart: countdownToStartTimer -= Time.deltaTime; if (countdownToStartTimer > 0f) return; state = State.GamePlaying; OnStateChanged?.Invoke(this, EventArgs.Empty); break; case State.GamePlaying: gamePlayingTimer -= Time.deltaTime; if (gamePlayingTimer > 0f) return; state = State.GameOver; gamePlayingTimer = gamePlayingTimerMax; OnStateChanged?.Invoke(this, EventArgs.Empty); break; case State.GameOver: break; } Debug.Log(state); } public bool IsGamePlaying() => state == State.GamePlaying; public bool IsCountToStartActive() => state == State.CountdownToStart; public float GetCountdownToStartTimer() => countdownToStartTimer; public bool IsGameOver() => state == State.GameOver; public float GetGamePlayingTimerNormalized() => 1 - (gamePlayingTimer / gamePlayingTimerMax); }