重构
This commit is contained in:
@@ -4,6 +4,7 @@ using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using UnityEngine.UI;
|
||||
using IndianOceanAssets.Engine2_5D;
|
||||
using Architecture.Core;
|
||||
|
||||
namespace GameFramework
|
||||
{
|
||||
@@ -13,11 +14,31 @@ namespace GameFramework
|
||||
/// </summary>
|
||||
public class GameManager : PersistentSingleton<GameManager>
|
||||
{
|
||||
/// <summary>游戏结束(失败)时触发。</summary>
|
||||
public static Action onGameOver;
|
||||
[Header("SO 事件通道(替代 static Action 事件,Inspector 拖入对应资产)")]
|
||||
[SerializeField] private GameEvent onGameOverEvent;
|
||||
[SerializeField] private GameEvent onGameWinEvent;
|
||||
|
||||
/// <summary>游戏胜利时触发。</summary>
|
||||
public static Action onGameWin;
|
||||
[Header("SO 事件通道(玩家死亡事件,替代 HealthSystem 直接调用 GameOver)")]
|
||||
[SerializeField] private GameEvent onPlayerDiedEvent;
|
||||
|
||||
[Header("运行时集合(替代 FindObjectsOfType<EnemyAI>,需敌人 Prefab 挂 RuntimeSetRegistrar 指向该集合)")]
|
||||
[SerializeField] private TransformRuntimeSet enemiesSet;
|
||||
[SerializeField] private EnemyManager enemyManagerRef;
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
if (onPlayerDiedEvent != null)
|
||||
onPlayerDiedEvent.Register(OnPlayerDied);
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
if (onPlayerDiedEvent != null)
|
||||
onPlayerDiedEvent.Unregister(OnPlayerDied);
|
||||
}
|
||||
|
||||
/// <summary>玩家死亡事件回调:触发失败流程(设置状态 + 过场 + 广播 OnGameOver)。</summary>
|
||||
private void OnPlayerDied() => GameOver();
|
||||
|
||||
public static GameState GameState
|
||||
{
|
||||
@@ -49,7 +70,7 @@ namespace GameFramework
|
||||
{
|
||||
if (Instance == null) return;
|
||||
GameState = GameState.GameOver;
|
||||
onGameOver?.Invoke();
|
||||
Instance.onGameOverEvent?.Raise();
|
||||
Instance.StartCoroutine(Instance.DeathTransition());
|
||||
}
|
||||
|
||||
@@ -58,7 +79,7 @@ namespace GameFramework
|
||||
{
|
||||
if (Instance == null) return;
|
||||
GameState = GameState.Victory;
|
||||
onGameWin?.Invoke();
|
||||
Instance.onGameWinEvent?.Raise();
|
||||
Instance.StartCoroutine(Instance.VictoryTransition());
|
||||
}
|
||||
|
||||
@@ -141,17 +162,32 @@ namespace GameFramework
|
||||
/// </summary>
|
||||
private void DisableAllEnemyAI()
|
||||
{
|
||||
// 禁用所有 EnemyAI
|
||||
var enemyAIs = FindObjectsOfType<IndianOceanAssets.Engine2_5D.EnemyAI>();
|
||||
foreach (var ai in enemyAIs)
|
||||
ai.enabled = false;
|
||||
int disabled = 0;
|
||||
|
||||
// 优先用 Enemies 运行时集合(敌人 Prefab 需挂 RuntimeSetRegistrar 并指向该集合,
|
||||
// 在 OnEnable/OnDisable 时自动注册/注销自身 Transform)
|
||||
if (enemiesSet != null)
|
||||
{
|
||||
foreach (var t in enemiesSet.Items)
|
||||
{
|
||||
if (t == null) continue;
|
||||
var ai = t.GetComponent<IndianOceanAssets.Engine2_5D.EnemyAI>();
|
||||
if (ai != null) { ai.enabled = false; disabled++; }
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 过渡期兜底:尚未接入 Enemies 集合时回退(Prefab 接入 RuntimeSetRegistrar 后可删除此分支)
|
||||
var enemyAIs = FindObjectsOfType<IndianOceanAssets.Engine2_5D.EnemyAI>();
|
||||
foreach (var ai in enemyAIs) ai.enabled = false;
|
||||
disabled = enemyAIs.Length;
|
||||
}
|
||||
|
||||
// 禁用 EnemyManager(停止生成/管理逻辑)
|
||||
var enemyManager = FindObjectOfType<IndianOceanAssets.Engine2_5D.EnemyManager>();
|
||||
if (enemyManager != null)
|
||||
enemyManager.enabled = false;
|
||||
if (enemyManagerRef != null)
|
||||
enemyManagerRef.enabled = false;
|
||||
|
||||
Debug.Log($"[GameManager] 已禁用 {enemyAIs.Length} 个 EnemyAI + EnemyManager");
|
||||
Debug.Log($"[GameManager] 已禁用 {disabled} 个 EnemyAI + EnemyManager");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -230,8 +266,7 @@ namespace GameFramework
|
||||
|
||||
yield return null;
|
||||
|
||||
// 在全黑之上显示失败叠加层("你已迷失……" + 主界面按钮)
|
||||
GameLostOverlay.Show();
|
||||
// 失败叠加层("你已迷失……")由 GameLostOverlay 订阅 OnGameOver 事件自显示,此处不再直接调用。
|
||||
|
||||
// 等待一帧让 UI 渲染
|
||||
yield return null;
|
||||
|
||||
Reference in New Issue
Block a user