UI 系统

This commit is contained in:
2026-06-09 10:41:43 +08:00
parent 247de307c6
commit e09bee31ec
31 changed files with 221439 additions and 997 deletions

View File

@@ -161,8 +161,12 @@ namespace BaseGames.UI
}
// ── 状态响应 ──────────────────────────────────────────────────────────
/// <summary>最近一次的游戏状态。用于背包/地图同键 toggle 时判断"是否在游戏内",避免在主菜单等 UI 上下文误开 Hub。</summary>
private GameStateId _currentState;
private void HandleGameStateChanged(GameStateId state)
{
_currentState = state;
bool showHud = state == GameStates.Gameplay || state == GameStates.BossFight;
if (_hudRoot != null) _hudRoot.SetActive(showHud);
@@ -284,19 +288,20 @@ namespace BaseGames.UI
private void OpenCharmPanel() => OpenPanel(PanelId.CharmPanel);
private void OpenSpellSelect() => OpenPanel(PanelId.SpellSelect);
/// <summary>背包键 toggle若统一背包屏正位于栈顶则关闭否则打开同键开/关。</summary>
/// <summary>背包键 toggle若统一背包屏正位于栈顶则关闭否则(仅游戏内)打开同键开/关。</summary>
private void OpenInventory()
{
if (_panelRegistry.TryGetValue(PanelId.Inventory, out var inv)
&& Navigator?.Top != null && Navigator.Top.gameObject == inv)
Navigator.Pop();
else
OpenPanel(PanelId.Inventory);
if (!_panelRegistry.TryGetValue(PanelId.Inventory, out var inv) || inv == null) return;
if (HubIsTop(inv)) { Navigator.Pop(); return; } // 已开 → 关闭
if (!InGameplay) return; // 仅游戏内允许打开(避免主菜单等误开)
OpenPanel(PanelId.Inventory);
}
/// <summary>
/// 快速直达:确保统一背包屏打开,并定位到指定内容根名对应的 Tab如 "Content_Map")。
/// 已打开则只切 Tab不关闭未打开则打开后切。按名定位与 Tab 顺序解耦
/// 快速直达:定位到指定内容根名对应的 Tab如 "Content_Map")。同键 toggle
/// 已在该 Tab → 关闭 Hub在其他 Tab → 切到该 Tab未打开 → (仅游戏内)打开并切到该 Tab
/// 按名定位,与 Tab 顺序解耦。
/// </summary>
private void OpenInventoryAt(string contentName)
{
@@ -305,11 +310,29 @@ namespace BaseGames.UI
Debug.LogWarning("[UIManager] 统一背包屏PanelId.Inventory未注册快速直达失败。", this);
return;
}
bool hubTop = Navigator?.Top != null && Navigator.Top.gameObject == inv;
if (!hubTop) OpenPanel(PanelId.Inventory); // 激活时 OnEnable 同步运行
inv.GetComponent<Inventory.InventoryHubPanel>()?.SelectTabByContentName(contentName);
var hub = inv.GetComponent<Inventory.InventoryHubPanel>();
if (HubIsTop(inv))
{
// 已显示目标 Tab → 同键关闭;否则切到目标 Tab不关闭
if (hub != null && hub.CurrentContentName == contentName) { Navigator.Pop(); return; }
hub?.SelectTabByContentName(contentName);
return;
}
if (!InGameplay) return; // 仅游戏内允许打开
OpenPanel(PanelId.Inventory); // 激活时 OnEnable 同步运行
hub?.SelectTabByContentName(contentName);
}
/// <summary>统一背包屏当前是否位于导航栈顶(即正在显示)。</summary>
private bool HubIsTop(GameObject inv)
=> Navigator?.Top != null && Navigator.Top.gameObject == inv;
/// <summary>当前是否处于游戏内Gameplay / BossFight——决定是否允许用快捷键打开 Hub。</summary>
private bool InGameplay
=> _currentState == GameStates.Gameplay || _currentState == GameStates.BossFight;
// ── 编辑器工具 ────────────────────────────────────────────────────────
[ContextMenu("验证面板注册表")]
private void EditorValidateRegistry()