UI 系统
This commit is contained in:
@@ -129,6 +129,12 @@ namespace BaseGames.UI.Inventory
|
||||
if (_tabs[i].content != null && _tabs[i].content.name == contentName) { SelectTab(i); return; }
|
||||
}
|
||||
|
||||
/// <summary>当前选中 Tab 的内容根名(如 "Content_Map");无有效 Tab 时为 null。供"同键 toggle"判断当前是否已在目标 Tab。</summary>
|
||||
public string CurrentContentName
|
||||
=> _tabs != null && _currentIndex >= 0 && _currentIndex < _tabs.Length && _tabs[_currentIndex].content != null
|
||||
? _tabs[_currentIndex].content.name
|
||||
: null;
|
||||
|
||||
private void SelectTab(int index, bool raise, bool animateEntry)
|
||||
{
|
||||
if (_tabs == null || _tabs.Length == 0) return;
|
||||
|
||||
@@ -149,9 +149,8 @@ namespace BaseGames.UI.Menus
|
||||
if (svc.HasSave(slotIndex))
|
||||
await svc.DeleteSlotAsync(slotIndex);
|
||||
|
||||
bool steel = level == DifficultyLevel.SteelSoul;
|
||||
svc.CreateSlot(slotIndex, steel);
|
||||
ServiceLocator.GetOrDefault<IDifficultyService>()?.BeginNewGame(level);
|
||||
// 统一会话入口:建档(内部应用空档并广播初始值)+ 应用难度。与 dev 直连共用,避免分叉。
|
||||
ServiceLocator.GetOrDefault<IGameSessionService>()?.BeginNewGame(slotIndex, level);
|
||||
|
||||
_onSlotConfirmed?.Raise(slotIndex);
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user