184 lines
5.6 KiB
C#
184 lines
5.6 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
namespace GameFramework
|
|
{
|
|
/// <summary>
|
|
/// 游戏结果类型。
|
|
/// </summary>
|
|
public enum GameResult { Win, Lose }
|
|
|
|
/// <summary>
|
|
/// 游戏结果界面(支持胜利/失败)。
|
|
/// 监听 GameManager.onGameOver 和 onGameWin 事件,
|
|
/// 显示对应面板并暂停游戏。确认后跳转到排行榜场景。
|
|
/// </summary>
|
|
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;
|
|
|
|
/// <summary>
|
|
/// 运行时初始化所有引用(由 GameManager 自动创建时调用)。
|
|
/// </summary>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 显示游戏结果界面。
|
|
/// </summary>
|
|
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");
|
|
}
|
|
}
|
|
}
|
|
}
|