using System; using System.Collections.Generic; using Cielonos.MainGame.Inventory; using Cielonos.MainGame.Inventory.Collections; using Sirenix.OdinInspector; using SLSUtilities.UI; using UnityEngine; using UnityEngine.UI; namespace Cielonos.MainGame.UI { /// /// 战后奖励选择界面的 UI 页面控制器。 /// 弹出时显示 3 个奖励卡片,玩家选择某一个卡片后,可以在详情面板中查看物品描述(或装备升级预览属性增益)。 /// 点击确认后,将奖励分发给玩家并关闭界面。 /// public class RewardChoiceUIPage : UIPageBase { [Title("Selectors")] [Tooltip("单个奖励选择卡片的预制体。")] public GameObject selectorPrefab; [Tooltip("卡片实例的父容器。")] public RectTransform selectorContainer; [Tooltip("当前生成的卡片列表。")] public List selectors = new List(); [Title("Detail Panel")] [Tooltip("右侧物品详细信息展示面板。")] public ItemDetailPanel itemDetailPanel; [Title("Buttons")] [Tooltip("确认选择的按钮。")] public Button confirmButton; [Tooltip("关闭/放弃选择的按钮。")] public Button closeButton; private RewardChoiceSelector currentSelected; private Action onConfirmCallback; /// 当前被选中的选项索引,若无选中则返回 -1。 public int SelectedIndex => currentSelected != null ? selectors.IndexOf(currentSelected) : -1; protected override void Start() { base.Start(); if (confirmButton != null) { confirmButton.onClick.AddListener(OnConfirmClicked); } if (closeButton != null) { closeButton.onClick.AddListener(OnCloseClicked); } } /// /// 设置候选奖励物品池并初始化卡片列表。 /// /// 生成的候选物品实例列表。 /// 当玩家确认选择时的回调函数(传入被选中的物品索引)。 public void SetOffers(List offers, Action onConfirm) { onConfirmCallback = onConfirm; ClearSelectors(); if (offers == null) return; // 循环为候选池中的每个物品生成卡片 UI for (int i = 0; i < offers.Count; i++) { ItemBase item = offers[i]; if (item == null) continue; RewardChoiceSelector selector = CreateSelector(); selector.Setup(item); } currentSelected = null; RefreshConfirmButton(); if (itemDetailPanel != null) { itemDetailPanel.ClearPanel(); } } /// /// 被卡片回调调用,当玩家点击某张卡片时更新选中状态,并在右侧面板展示详情。 /// public void SelectItem(RewardChoiceSelector selector) { if (selector == null || !selectors.Contains(selector)) return; // 取消之前选中卡片的高亮 if (currentSelected != null) { currentSelected.SetSelected(false); } // 设当前点击的卡片为选中状态 currentSelected = selector; currentSelected.SetSelected(true); if (itemDetailPanel != null) { ItemBase displayItem = currentSelected.item; // 针对升级组件(PrefabricatedComponent)做特殊处理:在详情页展示其目标装备升级前后的属性对比 if (displayItem is PrefabricatedComponent prefabComp && prefabComp.targetEquipment != null) { displayItem = prefabComp.targetEquipment; itemDetailPanel.SetItem(displayItem); // 在普通面板下方追加展示“属性提升预览” int currentLvl = displayItem.passiveAttributeSm?.level ?? 0; itemDetailPanel.AppendUpgradePreview(displayItem.upgradeData, currentLvl, prefabComp.stackAmount); } else { // 普通道具直接显示基础描述 itemDetailPanel.SetItem(displayItem); } } RefreshConfirmButton(); } protected override void OnPageOpened() { RefreshConfirmButton(); } protected override void OnPageClosed() { currentSelected = null; onConfirmCallback = null; } /// 确认选择按钮点击事件,执行回调并关闭页面。 private void OnConfirmClicked() { if (currentSelected == null) return; int index = SelectedIndex; if (index < 0) return; Action callback = onConfirmCallback; Close(); callback?.Invoke(index); } /// 关闭按钮点击事件,关闭当前界面。 private void OnCloseClicked() { Close(); } /// 从预制体实例化一个新的奖励卡片 UI。 private RewardChoiceSelector CreateSelector() { if (selectorPrefab == null || selectorContainer == null) { Debug.LogError("[RewardChoiceUIPage] selectorPrefab 或 selectorContainer 未配置。"); return null; } GameObject obj = Instantiate(selectorPrefab, selectorContainer); RewardChoiceSelector selector = obj.GetComponent(); if (selector == null) { Debug.LogError("[RewardChoiceUIPage] selectorPrefab 缺少 RewardChoiceSelector 组件。"); Destroy(obj); return null; } selectors.Add(selector); return selector; } /// 清空所有已生成的卡片实例。 private void ClearSelectors() { foreach (RewardChoiceSelector selector in selectors) { if (selector != null) { Destroy(selector.gameObject); } } selectors.Clear(); currentSelected = null; } /// 刷新确认按钮的启用/禁用状态(仅在选中卡片后可用)。 private void RefreshConfirmButton() { if (confirmButton != null) { confirmButton.interactable = currentSelected != null; } } } }