95 lines
2.4 KiB
C#
95 lines
2.4 KiB
C#
using UnityEngine;
|
|
using UnityEngine.InputSystem;
|
|
|
|
//Could be a singleton
|
|
public class GameFlowManager : MonoBehaviour {
|
|
/// <summary>
|
|
/// True if time is frozen (Start, Pause Menu, Dead)
|
|
/// </summary>
|
|
/// <remarks>Could be renamed appropriately</remarks>
|
|
[field: SerializeField]
|
|
public bool Paused { get; private set; } = true;
|
|
public BaseState CurrentState { get; private set; } = null!;
|
|
bool lastStartButton;
|
|
|
|
#region Unity Messages
|
|
void Awake() => CurrentState = new StartFlowState(this);
|
|
|
|
void Start() => CurrentState.EnterState();
|
|
#endregion
|
|
|
|
void SetPause(bool value) {
|
|
Paused = value;
|
|
Time.timeScale = value ? 0f : 1f;
|
|
}
|
|
|
|
#region Inputs
|
|
public void OnStart(InputAction.CallbackContext ctx) {
|
|
//feels pretty redundant ^^'
|
|
bool newValue = ctx.ReadValueAsButton();
|
|
bool wasJustPressed = !lastStartButton && newValue;
|
|
lastStartButton = newValue;
|
|
|
|
if (!wasJustPressed)
|
|
return;
|
|
|
|
if (CurrentState is StartFlowState)
|
|
SwitchState(new GameplayFlowState(this));
|
|
}
|
|
#endregion
|
|
|
|
#region States
|
|
void SwitchState(BaseState newState) {
|
|
CurrentState.LeaveState();
|
|
CurrentState = newState;
|
|
newState.EnterState();
|
|
}
|
|
|
|
abstract class GameFlowState : BaseState {
|
|
readonly protected GameFlowManager gameFlowManager;
|
|
|
|
protected GameFlowState(GameFlowManager gameFlowManager) {
|
|
this.gameFlowManager = gameFlowManager;
|
|
}
|
|
}
|
|
|
|
class StartFlowState : GameFlowState {
|
|
public StartFlowState(GameFlowManager gameFlowManager) : base(gameFlowManager) {}
|
|
|
|
public override void EnterState() {
|
|
base.EnterState();
|
|
|
|
Debug.Log("Press Start to start...!");
|
|
gameFlowManager.SetPause(true);
|
|
}
|
|
|
|
public override void LeaveState() {
|
|
Debug.Log("Let the games begin!!");
|
|
}
|
|
}
|
|
class GameplayFlowState : GameFlowState {
|
|
public GameplayFlowState(GameFlowManager gameFlowManager) : base(gameFlowManager) {}
|
|
|
|
public override void EnterState() {
|
|
base.EnterState();
|
|
gameFlowManager.SetPause(false);
|
|
}
|
|
}
|
|
class PauseMenuFlowState : GameFlowState {
|
|
public PauseMenuFlowState(GameFlowManager gameFlowManager) : base(gameFlowManager) {}
|
|
|
|
public override void EnterState() {
|
|
base.EnterState();
|
|
gameFlowManager.SetPause(true);
|
|
}
|
|
}
|
|
class DeadFlowState : GameFlowState {
|
|
public DeadFlowState(GameFlowManager gameFlowManager) : base(gameFlowManager) {}
|
|
|
|
public override void EnterState() {
|
|
base.EnterState();
|
|
gameFlowManager.SetPause(true);
|
|
}
|
|
}
|
|
#endregion
|
|
} |