Files
gold_dolphin/unity/Assets/UI/GameResultScreen.cs
T
2026-07-07 03:34:56 +08:00

182 lines
5.6 KiB
C#

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