using UnityEngine; using UnityEngine.UI; namespace GameFramework { /// /// 暂停菜单控制器。 /// 按 ESC 切换暂停/继续。 /// 暂停时显示菜单 Canvas,提供继续/设置/返回主菜单三个按钮。 /// 使用 old Input Manager(Input.GetKeyDown)。 /// public class PauseMenu : MonoBehaviour { [Header("Input")] [SerializeField] KeyCode pauseKey = KeyCode.Escape; [Header("Canvas")] [SerializeField] Canvas hudCanvas; [SerializeField] Canvas pauseMenuCanvas; [Header("Buttons")] [SerializeField] Button resumeButton; [SerializeField] Button settingsButton; [SerializeField] Button mainMenuButton; [Header("Settings Panel (placeholder)")] [SerializeField] GameObject settingsPanel; [SerializeField] Button settingsBackButton; [Header("Audio")] [SerializeField] AudioData pauseSFX; [SerializeField] AudioData unpauseSFX; bool isPaused = false; void Start() { // 绑定按钮 if (resumeButton != null) resumeButton.onClick.AddListener(OnResumeClick); if (settingsButton != null) settingsButton.onClick.AddListener(OnSettingsClick); if (mainMenuButton != null) mainMenuButton.onClick.AddListener(OnMainMenuClick); if (settingsBackButton != null) settingsBackButton.onClick.AddListener(OnSettingsBackClick); // 初始状态 if (pauseMenuCanvas != null) pauseMenuCanvas.enabled = false; if (settingsPanel != null) settingsPanel.SetActive(false); // 确保游戏开始时是运行状态 if (TimeController.Instance != null) TimeController.Instance.Unpause(); if (GameManager.Instance != null) GameManager.GameState = GameState.Playing; } void Update() { // 游戏结束时不允许暂停 if (GameManager.Instance != null && GameManager.GameState == GameState.GameOver) return; if (Input.GetKeyDown(pauseKey)) { if (isPaused) Resume(); else Pause(); } } void Pause() { isPaused = true; if (TimeController.Instance != null) TimeController.Instance.Pause(); if (GameManager.Instance != null) GameManager.GameState = GameState.Paused; if (hudCanvas != null) hudCanvas.enabled = false; if (pauseMenuCanvas != null) pauseMenuCanvas.enabled = true; // 显示鼠标 Cursor.visible = true; Cursor.lockState = CursorLockMode.None; // 选中继续按钮(手柄/键盘导航用) if (resumeButton != null) resumeButton.Select(); if (AudioManager.Instance != null && pauseSFX != null) AudioManager.Instance.PlaySFX(pauseSFX); } void Resume() { isPaused = false; if (TimeController.Instance != null) TimeController.Instance.Unpause(); if (GameManager.Instance != null) GameManager.GameState = GameState.Playing; if (hudCanvas != null) hudCanvas.enabled = true; if (pauseMenuCanvas != null) pauseMenuCanvas.enabled = false; // 隐藏鼠标 Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; if (AudioManager.Instance != null && unpauseSFX != null) AudioManager.Instance.PlaySFX(unpauseSFX); } // 只在 Pause 状态下才响应按钮 // Resume 是公开方法因为按钮 onClick 需要调用 public void OnResumeClick() { if (isPaused) Resume(); } void OnSettingsClick() { if (settingsPanel != null) settingsPanel.SetActive(true); } void OnSettingsBackClick() { if (settingsPanel != null) settingsPanel.SetActive(false); } void OnMainMenuClick() { // 先解除暂停,再加载主菜单 isPaused = false; if (TimeController.Instance != null) TimeController.Instance.Unpause(); if (pauseMenuCanvas != null) pauseMenuCanvas.enabled = false; if (SceneLoader.Instance != null) SceneLoader.Instance.LoadMainMenuScene(); } } }