Files
Cielonos/Assets/Scripts/MainGame/UI/PlayerUI/MainGamePages/RewardChoice/RewardChoiceSelector.cs
SoulliesOfficial 9a9e48f8a5
2026-06-27 12:52:03 -04:00

142 lines
4.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}
}
}