using System; using UnityEngine; // ゲーム全体の開始、勝敗、撃破数を管理する public class GameManager : MonoBehaviour { [SerializeField] private DamageReceiver playerDamageReceiver; [SerializeField] private PlayerController playerController; [SerializeField] private EnemySpawner enemySpawner; [SerializeField] private int clearDefeatCount = 10; public event Action StateChanged; public event Action DefeatCountChanged; public GameState State { get; private set; } = GameState.Ready; public int DefeatCount { get; private set; } public int ClearDefeatCount => clearDefeatCount; private void OnEnable() { // Enemyクラスの撃破通知を購読する Enemy.Defeated += OnEnemyDefeated; playerDamageReceiver.Died += OnPlayerDied; } private void OnDisable() { // GameManagerが無効になる際は購読を解除する Enemy.Defeated -= OnEnemyDefeated; playerDamageReceiver.Died -= OnPlayerDied; } private void Start() { ChangeState(GameState.Playing); DefeatCountChanged?.Invoke(DefeatCount, clearDefeatCount); } private void OnEnemyDefeated(Enemy enemy) { if (State != GameState.Playing) return; DefeatCount++; DefeatCountChanged?.Invoke(DefeatCount, clearDefeatCount); if (DefeatCount >= clearDefeatCount) Finish(GameState.GameClear); } private void OnPlayerDied() { Finish(GameState.GameOver); } private void Finish(GameState result) { if (State != GameState.Playing) return; playerController.SetControlEnabled(false); enemySpawner.StopGameplay(); ChangeState(result); } private void ChangeState(GameState nextState) { if (State == nextState) return; if (!CanTransition(State, nextState)) { Debug.LogWarning( $"許可されていない状態遷移です: {State} -> {nextState}"); return; } State = nextState; StateChanged?.Invoke(State); } private static bool CanTransition( GameState currentState, GameState nextState) { return (currentState, nextState) switch { (GameState.Ready, GameState.Playing) => true, (GameState.Playing, GameState.GameClear) => true, (GameState.Playing, GameState.GameOver) => true, _ => false }; } }