using System; using UnityEngine; public class GameManager : MonoBehaviour { [SerializeField] private float timeLimit = 60f; [SerializeField] private Health playerHealth; private float remainingTime; private GameState state = GameState.Ready; public float RemainingTime => remainingTime; public GameState State => state; public bool IsPlaying => state == GameState.Playing; public event Action StateChanged; public event Action TimeChanged; private void Start() { remainingTime = timeLimit; if (playerHealth != null) { playerHealth.Died += OnPlayerDied; } ChangeState(GameState.Playing); TimeChanged?.Invoke(remainingTime); } private void Update() { if (!IsPlaying) { return; } remainingTime = Mathf.Max(0f, remainingTime - Time.deltaTime); TimeChanged?.Invoke(remainingTime); if (remainingTime <= 0f) { ChangeState(GameState.Clear); } } private void OnDestroy() { if (playerHealth != null) { playerHealth.Died -= OnPlayerDied; } } private void OnPlayerDied() { ChangeState(GameState.GameOver); } private void ChangeState(GameState nextState) { if (state == nextState) { return; } state = nextState; StateChanged?.Invoke(state); } }