This repository has been archived on 2025-03-20. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
mojo-kitchen-chaos/Assets/Scripts/GameStateManager.cs

136 lines
3 KiB
C#

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 = 30f;
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);
}
}
}