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()
{
// 失败时由 GameLostOverlay 接管,不再显示旧失败面板
}
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");
}
}
}
}