KitchenChaos/Assets/Scripts/KitchenGameManager.cs

103 lines
2.9 KiB
C#

using System;
using UnityEngine;
public class KitchenGameManager : MonoBehaviour {
[SerializeField] private const float gamePlayingTimerMax = 300f;
private bool isGamePaused;
private State state;
public static KitchenGameManager Instance { get; private set; }
public float CountdownToStartTimer { get; private set; } = 1f;
public float GamePlayingTimer { get; private set; }
private void Awake() {
Instance = this;
state = State.WaitingToStart;
GamePlayingTimer = gamePlayingTimerMax;
}
private void Start() {
GameInput.Instance.OnPauseAction += GameInput_OnPauseAction;
GameInput.Instance.OnInteractAction += GameInput_OnInteractAction;
//DEBUG trigger game start automatically
state = State.CountdownToStart;
OnStateChanged?.Invoke(this, EventArgs.Empty);
}
private void Update() {
switch (state) {
case State.WaitingToStart:
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 event EventHandler OnStateChanged;
public event EventHandler OnGamePaused;
public event EventHandler OnGameUnpaused;
private void GameInput_OnPauseAction(object sender, EventArgs e) {
TogglePauseGame();
}
private void GameInput_OnInteractAction(object sender, EventArgs e) {
if (state == State.WaitingToStart) {
state = State.CountdownToStart;
OnStateChanged?.Invoke(this, EventArgs.Empty);
}
}
public void TogglePauseGame() {
isGamePaused = !isGamePaused;
if (isGamePaused) {
Time.timeScale = 0f;
OnGamePaused?.Invoke(this, EventArgs.Empty);
}
else {
Time.timeScale = 1f;
OnGameUnpaused?.Invoke(this, EventArgs.Empty);
}
}
public bool IsGamePlaying() {
return state == State.GamePlaying;
}
public bool IsCountToStartActive() {
return state == State.CountdownToStart;
}
public bool IsGameOver() {
return state == State.GameOver;
}
public float GetGamePlayingTimerNormalized() {
return 1 - GamePlayingTimer / gamePlayingTimerMax;
}
private enum State {
WaitingToStart,
CountdownToStart,
GamePlaying,
GameOver
}
}