142 lines
4.4 KiB
C#
142 lines
4.4 KiB
C#
using Cielonos.MainGame.Inventory;
|
||
using Cielonos.MainGame.Inventory.Collections;
|
||
using SLSUtilities.General;
|
||
using SLSUtilities.UI;
|
||
using TMPro;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
|
||
namespace Cielonos.MainGame.UI
|
||
{
|
||
/// <summary>
|
||
/// 奖励选择卡片 UI 组件。
|
||
/// 在奖励台(RewardTable)打开的界面中代表一个可选择的奖励选项。
|
||
/// 支持显示物品图标、名称、堆叠数,并且会对装备升级组件(PrefabricatedComponent)做特殊显示(显示目标装备图标,前缀为“升级:”)。
|
||
/// </summary>
|
||
public class RewardChoiceSelector : UIElementBase
|
||
{
|
||
private RewardChoiceUIPage Page => PlayerCanvas.MainGamePages.rewardChoicePage;
|
||
|
||
/// <summary>当前卡片绑定的奖励物品数据。</summary>
|
||
public ItemBase item;
|
||
|
||
/// <summary>当前奖励的数量/堆叠数。</summary>
|
||
public int stack = 1;
|
||
|
||
public Button button;
|
||
public Image background, itemIcon, rarityFrame, selectorHint;
|
||
public TMP_Text itemName, itemStack;
|
||
public RectTransform tagContainer;
|
||
|
||
[Header("视觉设置")]
|
||
public Color normalColor = new Color(0.2f, 0.2f, 0.2f, 0.8f);
|
||
public Color selectedColor = new Color(0.4f, 0.6f, 0.9f, 0.9f);
|
||
|
||
private bool isSelected;
|
||
|
||
/// <summary>
|
||
/// 初始化卡片,填充奖励的图标、文字、按钮监听等信息。
|
||
/// </summary>
|
||
public void Setup(ItemBase itemRef)
|
||
{
|
||
item = itemRef;
|
||
|
||
if (item == null)
|
||
{
|
||
Hide();
|
||
return;
|
||
}
|
||
|
||
stack = 1;
|
||
if (item is ConsumableBase consumable)
|
||
{
|
||
stack = consumable.stackAmount;
|
||
}
|
||
|
||
ContentData data = item.contentData;
|
||
|
||
// 针对升级组件 PrefabricatedComponent 进行特殊处理:显示其所指向的目标升级装备的图标和信息
|
||
if (item is PrefabricatedComponent prefabComp && prefabComp.targetEquipment != null)
|
||
{
|
||
data = prefabComp.targetEquipment.contentData;
|
||
}
|
||
|
||
if (data == null)
|
||
{
|
||
Debug.LogWarning($"[RewardChoiceSelector] 隐藏选项:项 {item.gameObject.name} (或其目标装备) 的 ContentData 未配置!");
|
||
Hide();
|
||
return;
|
||
}
|
||
|
||
Sprite icon = data.itemIcon;
|
||
if (itemIcon != null)
|
||
{
|
||
itemIcon.sprite = icon;
|
||
itemIcon.enabled = icon != null;
|
||
}
|
||
|
||
if (itemName != null)
|
||
{
|
||
string nameText = data.displayNameKey.Localize("Items");
|
||
if (item is PrefabricatedComponent)
|
||
{
|
||
// 升级选项增加中文“升级:”前缀
|
||
nameText = $"升级: {nameText}";
|
||
}
|
||
itemName.text = nameText;
|
||
}
|
||
|
||
RefreshStackText();
|
||
SetSelected(false);
|
||
|
||
if (button != null)
|
||
{
|
||
button.onClick.RemoveAllListeners();
|
||
button.onClick.AddListener(OnClicked);
|
||
}
|
||
|
||
Show();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设定当前选项是否被选中,更新背景颜色和指示状态。
|
||
/// </summary>
|
||
public void SetSelected(bool selected)
|
||
{
|
||
isSelected = selected;
|
||
|
||
if (background != null)
|
||
{
|
||
background.color = isSelected ? selectedColor : normalColor;
|
||
}
|
||
|
||
if (selectorHint != null)
|
||
{
|
||
selectorHint.enabled = isSelected;
|
||
}
|
||
}
|
||
|
||
/// <summary>卡片被点击时的回调,通知父级 UIPage 选中自己。</summary>
|
||
private void OnClicked()
|
||
{
|
||
Page?.SelectItem(this);
|
||
}
|
||
|
||
/// <summary>根据当前堆叠数量,刷新卡片右下角的数量文本显示。</summary>
|
||
private void RefreshStackText()
|
||
{
|
||
if (this.itemStack == null) return;
|
||
|
||
if (stack > 1)
|
||
{
|
||
this.itemStack.text = $"x{stack}";
|
||
this.itemStack.gameObject.SetActive(true);
|
||
}
|
||
else
|
||
{
|
||
this.itemStack.gameObject.SetActive(false);
|
||
}
|
||
}
|
||
}
|
||
}
|