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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|