161 lines
4.8 KiB
C#
161 lines
4.8 KiB
C#
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
|
||
namespace GameFramework
|
||
{
|
||
/// <summary>
|
||
/// 暂停菜单控制器。
|
||
/// 按 ESC 切换暂停/继续。
|
||
/// 暂停时显示菜单 Canvas,提供继续/设置/返回主菜单三个按钮。
|
||
/// 使用 old Input Manager(Input.GetKeyDown)。
|
||
/// </summary>
|
||
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();
|
||
}
|
||
}
|
||
}
|