多轮审查和修复
This commit is contained in:
@@ -13,14 +13,9 @@ namespace BaseGames.Core
|
||||
[DefaultExecutionOrder(-1000)]
|
||||
public class GameManager : MonoBehaviour
|
||||
{
|
||||
// ── 单例 ──────────────────────────────────────────────────────────
|
||||
public static GameManager Instance { get; private set; }
|
||||
|
||||
// ── Inspector 引用 ────────────────────────────────────────────────
|
||||
[Header("Managers")]
|
||||
[SerializeField] private SettingsManager _settingsManager;
|
||||
[SerializeField] private DeathRespawnService _deathRespawnService;
|
||||
[SerializeField] private SceneService _sceneService;
|
||||
|
||||
[Header("Event Channels - Listen")]
|
||||
[SerializeField] private VoidEventChannelSO _onPlayerDied;
|
||||
@@ -35,54 +30,51 @@ namespace BaseGames.Core
|
||||
[SerializeField] private VoidEventChannelSO _onPlayerRespawned;
|
||||
|
||||
// ── 状态机 ────────────────────────────────────────────────────────
|
||||
private readonly GameStateMachine _fsm = new GameStateMachine();
|
||||
private readonly GameStateMachine _fsm = new GameStateMachine();
|
||||
private readonly CompositeDisposable _subs = new();
|
||||
public GameStateId CurrentState => _fsm.CurrentStateId;
|
||||
|
||||
private static GameManager _instance;
|
||||
|
||||
// ──────────────────────────────────────────────────────────────────
|
||||
private void Awake()
|
||||
{
|
||||
if (Instance != null && Instance != this) { Destroy(gameObject); return; }
|
||||
Instance = this;
|
||||
DontDestroyOnLoad(gameObject);
|
||||
if (_instance != null) { Destroy(gameObject); return; }
|
||||
_instance = this;
|
||||
DontDestroyOnLoad(transform.root.gameObject);
|
||||
|
||||
RegisterServices();
|
||||
RegisterStates();
|
||||
_settingsManager?.Initialize();
|
||||
|
||||
_fsm.TransitionTo(GameStates.Initializing, out _);
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
private void Start()
|
||||
{
|
||||
if (_onPlayerDied) _onPlayerDied.OnEventRaised += HandlePlayerDied;
|
||||
if (_onPauseRequested) _onPauseRequested.OnEventRaised += HandlePauseRequested;
|
||||
if (_onResumeRequested) _onResumeRequested.OnEventRaised += HandleResumeRequested;
|
||||
if (_onBossFightStarted) _onBossFightStarted.OnEventRaised += HandleBossFightStarted;
|
||||
if (_onBossFightEnded) _onBossFightEnded.OnEventRaised += HandleBossFightEnded;
|
||||
if (_onDeathScreenConfirmed) _onDeathScreenConfirmed.OnEventRaised += HandleDeathScreenConfirmed;
|
||||
// 在 Start 广播初始状态,确保其他组件已在 OnEnable 中完成订阅。
|
||||
_onGameStateChanged?.Raise(new Events.GameStateId(GameStates.Initializing.Id));
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
private void OnEnable()
|
||||
{
|
||||
if (_onPlayerDied) _onPlayerDied.OnEventRaised -= HandlePlayerDied;
|
||||
if (_onPauseRequested) _onPauseRequested.OnEventRaised -= HandlePauseRequested;
|
||||
if (_onResumeRequested) _onResumeRequested.OnEventRaised -= HandleResumeRequested;
|
||||
if (_onBossFightStarted) _onBossFightStarted.OnEventRaised -= HandleBossFightStarted;
|
||||
if (_onBossFightEnded) _onBossFightEnded.OnEventRaised -= HandleBossFightEnded;
|
||||
if (_onDeathScreenConfirmed) _onDeathScreenConfirmed.OnEventRaised -= HandleDeathScreenConfirmed;
|
||||
_onPlayerDied? .Subscribe(HandlePlayerDied).AddTo(_subs);
|
||||
_onPauseRequested? .Subscribe(HandlePauseRequested).AddTo(_subs);
|
||||
_onResumeRequested? .Subscribe(HandleResumeRequested).AddTo(_subs);
|
||||
_onBossFightStarted? .Subscribe(HandleBossFightStarted).AddTo(_subs);
|
||||
_onBossFightEnded? .Subscribe(HandleBossFightEnded).AddTo(_subs);
|
||||
_onDeathScreenConfirmed?.Subscribe(HandleDeathScreenConfirmed).AddTo(_subs);
|
||||
}
|
||||
|
||||
private void OnDisable() => _subs.Clear();
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (_instance == this) _instance = null;
|
||||
}
|
||||
|
||||
private void Update() => _fsm.Tick(Time.deltaTime);
|
||||
|
||||
// ── 初始化 ────────────────────────────────────────────────────────
|
||||
private void RegisterServices()
|
||||
{
|
||||
if (_deathRespawnService)
|
||||
ServiceLocator.Register<IDeathRespawnService>(_deathRespawnService);
|
||||
if (_sceneService)
|
||||
ServiceLocator.Register<ISceneService>(_sceneService);
|
||||
}
|
||||
|
||||
private void RegisterStates()
|
||||
{
|
||||
_fsm.Register(new InitializingState());
|
||||
@@ -111,8 +103,13 @@ namespace BaseGames.Core
|
||||
|
||||
// ── 事件处理 ──────────────────────────────────────────────────────
|
||||
private void HandlePlayerDied() => StartCoroutine(DeathFlow());
|
||||
private void HandlePauseRequested() => RequestTransition(GameStates.Paused);
|
||||
private void HandleResumeRequested() => RequestTransition(GameStates.Gameplay);
|
||||
private void HandlePauseRequested()
|
||||
{
|
||||
_prePauseState = _fsm.CurrentStateId;
|
||||
RequestTransition(GameStates.Paused);
|
||||
}
|
||||
|
||||
private void HandleResumeRequested() => RequestTransition(_prePauseState);
|
||||
|
||||
private void HandleBossFightStarted(string bossId)
|
||||
=> RequestTransition(GameStates.BossFight);
|
||||
@@ -123,13 +120,23 @@ namespace BaseGames.Core
|
||||
else RequestTransition(GameStates.GameOver);
|
||||
}
|
||||
|
||||
private bool _deathScreenConfirmed;
|
||||
private bool _deathScreenConfirmed;
|
||||
private GameStateId _prePauseState = GameStates.Gameplay;
|
||||
private void HandleDeathScreenConfirmed() => _deathScreenConfirmed = true;
|
||||
|
||||
private IEnumerator DeathFlow()
|
||||
{
|
||||
RequestTransition(GameStates.Dead);
|
||||
var deathService = ServiceLocator.Get<IDeathRespawnService>();
|
||||
|
||||
// SteelSoul 模式:清档后返回主菜单(架构 19 §6)
|
||||
var scaler = ServiceLocator.GetOrDefault<IDifficultyService>()?.CurrentScaler;
|
||||
if (scaler != null && scaler.InstantDeathOnZeroHP)
|
||||
{
|
||||
yield return deathService.StartGameOverCoroutine();
|
||||
yield break;
|
||||
}
|
||||
|
||||
yield return deathService.StartDeathSequenceCoroutine();
|
||||
|
||||
// 等待玩家在死亡画面点击重试
|
||||
|
||||
Reference in New Issue
Block a user