using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; namespace GameFramework { /// /// 游戏结果类型。 /// public enum GameResult { Win, Lose } /// /// 游戏结果界面(支持胜利/失败)。 /// 监听 GameManager.onGameOver 和 onGameWin 事件, /// 显示对应面板并暂停游戏。确认后跳转到排行榜场景。 /// public class GameResultScreen : MonoBehaviour { [Header("Canvas")] [SerializeField] private Canvas resultCanvas; [Header("胜利面板")] [SerializeField] private GameObject winPanel; [SerializeField] private Button winConfirmButton; [SerializeField] private Text winTitleText; [SerializeField] private Text winScoreText; [Header("失败面板")] [SerializeField] private GameObject losePanel; [SerializeField] private Button loseConfirmButton; [SerializeField] private Text loseTitleText; [SerializeField] private Text loseScoreText; [Header("Audio")] [SerializeField] private AudioData winSFX; [SerializeField] private AudioData loseSFX; [Header("Input")] [SerializeField] private KeyCode confirmKey = KeyCode.Return; private bool _isVisible; /// /// 运行时初始化所有引用(由 GameManager 自动创建时调用)。 /// public void Initialize(Canvas canvas, GameObject win, Button winBtn, Text winTitle, Text winScore, GameObject lose, Button loseBtn, Text loseTitle, Text loseScore) { resultCanvas = canvas; winPanel = win; winConfirmButton = winBtn; winTitleText = winTitle; winScoreText = winScore; losePanel = lose; loseConfirmButton = loseBtn; loseTitleText = loseTitle; loseScoreText = loseScore; } void OnEnable() { GameManager.onGameOver += OnGameOver; GameManager.onGameWin += OnGameWin; } void OnDisable() { GameManager.onGameOver -= OnGameOver; GameManager.onGameWin -= OnGameWin; } void OnGameOver() => ShowResult(GameResult.Lose); void OnGameWin() => ShowResult(GameResult.Win); void Start() { // 初始隐藏 if (resultCanvas != null) resultCanvas.enabled = false; // 绑定按钮 if (winConfirmButton != null) winConfirmButton.onClick.AddListener(OnConfirmClick); if (loseConfirmButton != null) loseConfirmButton.onClick.AddListener(OnConfirmClick); } /// /// 显示游戏结果界面。 /// public void ShowResult(GameResult result) { _isVisible = true; // 显示 Canvas if (resultCanvas != null) resultCanvas.enabled = true; // 更新分数显示 int score = ScoreManager.Instance != null ? ScoreManager.Instance.CurrentScore : 0; if (result == GameResult.Win) { // 显示胜利面板,隐藏失败面板 if (winPanel != null) winPanel.SetActive(true); if (losePanel != null) losePanel.SetActive(false); if (winScoreText != null) winScoreText.text = $"分数: {score}"; if (winConfirmButton != null) winConfirmButton.Select(); if (AudioManager.Instance != null && winSFX != null) AudioManager.Instance.PlaySFX(winSFX); } else { // 显示失败面板,隐藏胜利面板 if (winPanel != null) winPanel.SetActive(false); if (losePanel != null) losePanel.SetActive(true); if (loseScoreText != null) loseScoreText.text = $"分数: {score}"; if (loseConfirmButton != null) loseConfirmButton.Select(); if (AudioManager.Instance != null && loseSFX != null) AudioManager.Instance.PlaySFX(loseSFX); } // 暂停游戏 if (TimeController.Instance != null) { TimeController.Instance.Pause(); } else { // 没有 TimeController 时直接设置 timeScale Time.timeScale = 0f; } // 显示鼠标 Cursor.visible = true; Cursor.lockState = CursorLockMode.None; } void Update() { if (!_isVisible) return; // 按确认键跳转 if (Input.GetKeyDown(confirmKey) || Input.GetKeyDown(KeyCode.Space)) { OnConfirmClick(); } } void OnConfirmClick() { _isVisible = false; // 解除暂停 if (TimeController.Instance != null) { TimeController.Instance.Unpause(); } else { Time.timeScale = 1f; } // 跳转到排行榜 if (SceneLoader.Instance != null) { SceneLoader.Instance.LoadScoringScene(); } else { // 没有 SceneLoader 时直接加载场景 SceneManager.LoadScene("Scoring"); } } } }