Files
Cielonos/Assets/Scripts/MainGame/UI/PlayerUI/MainGamePages/Settlement/SettlementUIPage.cs

134 lines
4.7 KiB
C#
Raw Normal View History

2026-05-10 11:47:55 -04:00
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();
2026-06-12 17:11:39 -04:00
if (MainGameManager.Instance.sceneSm.IsCityArena)
{
RunManager.Instance.OnPhaseChanged += OnPhaseChanged;
restartButton.onClick.AddListener(OnRestartClicked);
mainMenuButton.onClick.AddListener(OnMainMenuClicked);
}
2026-05-10 11:47:55 -04:00
}
private void OnDestroy()
{
2026-06-12 17:11:39 -04:00
if (MainGameManager.Instance.sceneSm.IsCityArena)
{
RunManager.Instance.OnPhaseChanged -= OnPhaseChanged;
}
2026-05-10 11:47:55 -04:00
}
// ================================================================
// 阶段监听
// ================================================================
/// <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);
}
}
}