Files
Cielonos/Assets/Scripts/MainGame/UI/PlayerUI/MainGamePages/Settlement/SettlementUIPage.cs
2026-05-10 11:47:55 -04:00

128 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using Cielonos.MainGame.Characters;
using SLSUtilities.UI;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace Cielonos.MainGame.UI
{
/// <summary>
/// 结算画面 UI 页面Demo 版本)。
/// 在 RunPhase.Settlement 时自动打开,显示通关时间、稀有材料数量和受伤次数。
/// 提供"重新开始"和"回到主菜单"两个按钮。
/// </summary>
public class SettlementUIPage : UIPageBase
{
// ================================================================
// 序列化字段
// ================================================================
[Header("Stats")]
[SerializeField] private TMP_Text clearTimeText;
[SerializeField] private TMP_Text rareMaterialText;
[SerializeField] private TMP_Text hurtCountText;
[Header("Buttons")]
[SerializeField] private Button restartButton;
[SerializeField] private Button mainMenuButton;
[FormerlySerializedAs("mainMenuSceneName")]
[Header("Settings")]
[Tooltip("回到主菜单时加载的场景名称")]
[SerializeField] private string menuSceneName = "Menu";
// ================================================================
// 生命周期
// ================================================================
protected override void Start()
{
base.Start();
RunManager.Instance.OnPhaseChanged += OnPhaseChanged;
restartButton.onClick.AddListener(OnRestartClicked);
mainMenuButton.onClick.AddListener(OnMainMenuClicked);
}
private void OnDestroy()
{
RunManager.Instance.OnPhaseChanged -= OnPhaseChanged;
}
// ================================================================
// 阶段监听
// ================================================================
/// <summary>RunManager 阶段切换回调,进入 Settlement 时打开结算画面。</summary>
private void OnPhaseChanged(RunPhase phase)
{
if (phase == RunPhase.Settlement)
Open();
}
/// <summary>页面打开时填充统计数据。</summary>
protected override void OnPageOpened()
{
base.OnPageOpened();
PopulateStats();
}
// ================================================================
// 数据填充
// ================================================================
/// <summary>根据当前 RunState 和玩家背包数据填充结算数据。</summary>
private void PopulateStats()
{
RunState run = RunManager.Instance?.currentRun;
// 通关时间MM:SS 或 HH:MM:SS
if (clearTimeText != null)
{
float elapsed = run?.elapsedTime ?? 0f;
TimeSpan ts = TimeSpan.FromSeconds(elapsed);
clearTimeText.text = ts.TotalHours >= 1
? $"{(int)ts.TotalHours:D2}:{ts.Minutes:D2}:{ts.Seconds:D2}"
: $"{ts.Minutes:D2}:{ts.Seconds:D2}";
}
// 稀有材料数量(从玩家背包读取)
if (rareMaterialText != null)
{
int amount = 0;
Player player = MainGameManager.Player;
if (player != null)
amount = player.inventorySc.GetRareMaterialAmount();
rareMaterialText.text = amount.ToString();
}
// 受伤次数(实际扣血次数,不含被盾完全抵挡的受击)
if (hurtCountText != null)
{
int hurt = run?.hurtCount ?? 0;
hurtCountText.text = hurt.ToString();
}
}
// ================================================================
// 按钮回调
// ================================================================
/// <summary>重新开始一局 Run关闭结算画面并启动新一局。</summary>
public void OnRestartClicked()
{
Close();
if (RunManager.Instance != null)
RunManager.Instance.StartNewRun();
}
/// <summary>回到主菜单:加载主菜单场景。</summary>
public void OnMainMenuClicked()
{
SceneManager.LoadScene(menuSceneName);
}
}
}