Files
gold_dolphin/unity/Assets/UI/PauseMenu.cs
T
2026-06-30 09:46:59 +08:00

161 lines
4.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEngine;
using UnityEngine.UI;
namespace GameFramework
{
/// <summary>
/// 暂停菜单控制器。
/// 按 ESC 切换暂停/继续。
/// 暂停时显示菜单 Canvas,提供继续/设置/返回主菜单三个按钮。
/// 使用 old Input ManagerInput.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();
}
}
}