using UnityEngine; using UnityEngine.UI; using BaseGames.Core.Assets; using BaseGames.Core.Events; namespace BaseGames.UI { /// /// 暂停菜单控制器(架构 10_UIModule §5)。 /// 挂载在 Canvas_Menu → PauseMenuPanel GameObject 上。 /// 按钮绑定在 Awake 中完成;生命周期 / 焦点由 统一处理。 /// public class PauseMenuController : UIPanelBase { // UIManager 通过 ServiceLocator 解析,开启时自动获取,无需 Inspector 直接绑定具体类型 private IUIManager _uiManager; [Header("按钮引用")] [SerializeField] private Button _btnResume; [SerializeField] private Button _btnSettings; [SerializeField] private Button _btnMainMenu; [SerializeField] private Button _btnQuit; [Header("Event Channels")] [SerializeField] private VoidEventChannelSO _onResumeRequested; [SerializeField] private SceneLoadRequestEventChannelSO _onSceneLoadRequest; private void Awake() { _btnResume?.onClick.AddListener(Resume); _btnSettings?.onClick.AddListener(OpenSettings); _btnMainMenu?.onClick.AddListener(GoToMainMenu); _btnQuit?.onClick.AddListener(Application.Quit); } // 暂停面板由 UIManager 开启,此时 ServiceLocator 已就绪 protected override void OnPanelOpen() => _uiManager = GetService(); protected override void OnPanelClose() => _uiManager = null; /// 默认焦点 / 焦点恢复回到"继续"按钮(基类 FocusFirst 调用)。 protected override GameObject ResolveFirstSelected() => _btnResume != null ? _btnResume.gameObject : null; // ── 按钮回调 ────────────────────────────────────────────────────────── private void Resume() { _onResumeRequested?.Raise(); _uiManager?.CloseTopPanel(); } private void OpenSettings() { _uiManager?.OpenPanel(PanelId.Settings); } private void GoToMainMenu() { _uiManager?.CloseTopPanel(); _onSceneLoadRequest?.Raise(new SceneLoadRequest { SceneName = AddressKeys.SceneMainMenu, TransitionType = TransitionType.Scene, ShowLoadingScreen = false, }); } } }