128 lines
4.5 KiB
C#
128 lines
4.5 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|