136 lines
3 KiB
C#
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 = 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);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|