using System; using System.Collections.Generic; using Cielonos.MainGame.Inventory; using Sirenix.OdinInspector; using SLSUtilities.UI; using UnityEngine; using UnityEngine.UI; namespace Cielonos.MainGame.UI { /// /// 机械台 UI 页面。 /// 左侧为可选装备列表(Selector),右侧为物品详情面板(ItemDetailPanel)。 /// 玩家点击列表条目选中物品,点击 Confirm 确认获取。 /// public class MechanicalTableUIPage : UIPageBase { [Title("Selectors")] public GameObject selectorPrefab; public RectTransform selectorContainer; public List selectors = new List(); [Title("Detail Panel")] public ItemDetailPanel itemDetailPanel; [Title("Buttons")] public Button confirmButton; public Button closeButton; private MechanicalTableSelector currentSelected; private Action onConfirmCallback; private Action onSkipCallback; /// 当前选中的 Selector 索引,-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); } } /// /// 用物品预制体列表填充选择器,并注册确认回调。 /// 每次调用会清除旧选择器并重新生成。 /// /// 物品候选列表。奖励系统统一以 ItemBase 作为候选数据。 /// 玩家点击 Confirm 后的回调,参数为选中的物品索引。 public void SetOffers(List items, Action onConfirm) { SetOffers(items, onConfirm, null); } public void SetOffers(List items, Action onConfirm, Action onSkip) { onConfirmCallback = onConfirm; onSkipCallback = onSkip; ClearSelectors(); if (items == null) return; for (int i = 0; i < items.Count; i++) { ItemBase item = items[i]; if (item == null) { continue; } MechanicalTableSelector selector = CreateSelector(); if (selector != null) { selector.Setup(item); } } // 重置选中状态 currentSelected = null; RefreshConfirmButton(); // 详情面板默认隐藏 if (itemDetailPanel != null) { itemDetailPanel.ClearPanel(); } } /// /// 由 MechanicalTableSelector 调用,选中指定的选择器。 /// public void SelectItem(MechanicalTableSelector selector) { if (selector == null || !selectors.Contains(selector)) return; // 取消上一个选中 if (currentSelected != null) { currentSelected.SetSelected(false); } // 设置新选中 currentSelected = selector; currentSelected.SetSelected(true); // 更新详情面板 if (itemDetailPanel != null) { itemDetailPanel.SetItem(currentSelected.item); } // 启用确认按钮 RefreshConfirmButton(); } protected override void OnPageOpened() { RefreshConfirmButton(); } protected override void OnPageClosed() { currentSelected = null; onConfirmCallback = null; onSkipCallback = null; } private void OnConfirmClicked() { if (currentSelected == null) return; int index = SelectedIndex; if (index < 0) return; // 先缓存回调,因为 Close() 会清除引用 Action callback = onConfirmCallback; Close(); callback?.Invoke(index); } private void OnCloseClicked() { Action callback = onSkipCallback; Close(); callback?.Invoke(); } private MechanicalTableSelector CreateSelector() { if (selectorPrefab == null || selectorContainer == null) { Debug.LogError("[MechanicalTableUIPage] selectorPrefab 或 selectorContainer 未配置。"); return null; } GameObject obj = Instantiate(selectorPrefab, selectorContainer); MechanicalTableSelector selector = obj.GetComponent(); if (selector == null) { Debug.LogError("[MechanicalTableUIPage] selectorPrefab 缺少 MechanicalTableSelector 组件。"); Destroy(obj); return null; } selectors.Add(selector); return selector; } private void ClearSelectors() { foreach (MechanicalTableSelector selector in selectors) { if (selector != null) { Destroy(selector.gameObject); } } selectors.Clear(); currentSelected = null; } private void RefreshConfirmButton() { if (confirmButton != null) { confirmButton.interactable = currentSelected != null; } } } }