using System; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using TMPro; using BaseGames.Core.Events; using BaseGames.Localization; namespace BaseGames.UI.MainMenu { /// /// 新游戏模式选择面板(普通 / 钢铁之魂):开新档前选择难度模式。 /// /// 设计: /// · 自包含、场景无关——本地 SetActive 显隐 + 回调,不走 UIManager 面板栈, /// 与 MainMenuController 现有的子面板管理方式一致。 /// · 选定后通过 onModeChosen 回调把 DifficultyLevel 交还给调用方(SaveSlotController), /// 由调用方负责 CreateSlot(slot, steelSoul) + IDifficultyService.BeginNewGame(level)。 /// · 钢铁之魂为破坏性/高难选项,默认焦点置于普通,并显示一段警示文案。 /// public class NewGameModeController : MonoBehaviour { [Header("根节点(显隐用,留空则用本 GameObject)")] [SerializeField] private GameObject _root; [Header("按钮")] [SerializeField] private Button _btnNormal; [SerializeField] private Button _btnSteelSoul; [SerializeField] private Button _btnBack; [Header("钢铁之魂说明")] [Tooltip("选中钢铁之魂时显示的警示文案(一命模式,死亡即清档)。走本地化键 MODE_STEELSOUL_DESC。")] [SerializeField] private TMP_Text _steelSoulDescText; [SerializeField] private string _steelSoulDescKey = "MODE_STEELSOUL_DESC"; private Action _onModeChosen; private Action _onBack; private void Awake() { _btnNormal? .onClick.AddListener(() => Choose(DifficultyLevel.Normal)); _btnSteelSoul?.onClick.AddListener(() => Choose(DifficultyLevel.SteelSoul)); _btnBack? .onClick.AddListener(HandleBack); SetVisible(false); } /// /// 弹出模式选择。 /// /// 玩家选定模式后回调(面板已自动关闭),携带难度档位。 /// 点击返回 / 取消后回调(可选)。 public void Show(Action onModeChosen, Action onBack = null) { _onModeChosen = onModeChosen; _onBack = onBack; if (_steelSoulDescText != null && !string.IsNullOrEmpty(_steelSoulDescKey)) { string s = LocalizationManager.Get(_steelSoulDescKey, LocalizationTable.UI); _steelSoulDescText.text = string.IsNullOrEmpty(s) ? _steelSoulDescKey : s; } SetVisible(true); // 默认焦点置于普通模式(避免误选一命模式) EventSystem.current?.SetSelectedGameObject(_btnNormal != null ? _btnNormal.gameObject : _btnSteelSoul?.gameObject); } /// 外部强制关闭,不触发回调。 public void Close() { _onModeChosen = null; _onBack = null; SetVisible(false); } // ── 回调 ────────────────────────────────────────────────────────────── private void Choose(DifficultyLevel level) { var cb = _onModeChosen; SetVisible(false); _onModeChosen = null; _onBack = null; cb?.Invoke(level); } private void HandleBack() { var cb = _onBack; SetVisible(false); _onModeChosen = null; _onBack = null; cb?.Invoke(); } // ── 工具 ────────────────────────────────────────────────────────────── private void SetVisible(bool visible) { var go = _root != null ? _root : gameObject; go.SetActive(visible); } } }