using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; using Architecture.Core; namespace GameFramework { /// /// 游戏结果类型。 /// public enum GameResult { Win, Lose } /// /// 游戏结果界面(仅负责「胜利」结算)。 /// 监听 OnGameWin 事件,显示胜利面板并暂停游戏,确认后跳转到排行榜场景。 /// 「失败」由 GameLostOverlay 接管(订阅 OnGameOver),本屏不处理失败,避免空响应。 /// 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; [Header("SO 事件通道(胜利事件;失败由 GameLostOverlay 接管)")] [SerializeField] private GameEvent onGameWinEvent; 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() { onGameWinEvent?.Register(OnGameWin); } void OnDisable() { onGameWinEvent?.Unregister(OnGameWin); } 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"); } } } }