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 { /// /// 结算画面 UI 页面(Demo 版本)。 /// 在 RunPhase.Settlement 时自动打开,显示通关时间、稀有材料数量和受伤次数。 /// 提供"重新开始"和"回到主菜单"两个按钮。 /// 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; } // ================================================================ // 阶段监听 // ================================================================ /// RunManager 阶段切换回调,进入 Settlement 时打开结算画面。 private void OnPhaseChanged(RunPhase phase) { if (phase == RunPhase.Settlement) Open(); } /// 页面打开时填充统计数据。 protected override void OnPageOpened() { base.OnPageOpened(); PopulateStats(); } // ================================================================ // 数据填充 // ================================================================ /// 根据当前 RunState 和玩家背包数据填充结算数据。 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(); } } // ================================================================ // 按钮回调 // ================================================================ /// 重新开始一局 Run:关闭结算画面并启动新一局。 public void OnRestartClicked() { Close(); if (RunManager.Instance != null) RunManager.Instance.StartNewRun(); } /// 回到主菜单:加载主菜单场景。 public void OnMainMenuClicked() { SceneManager.LoadScene(menuSceneName); } } }