Files
Cielonos/Assets/Scripts/MainGame/UI/Common/InteractionPage/InteractionChoiceItem.cs
SoulliesOfficial 6d7ebc5825 Passion & UI
2026-06-12 17:11:39 -04:00

82 lines
2.7 KiB
C#

using SLSUtilities.UI;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace Cielonos.UI
{
/// <summary>
/// 交互选项列表中单个条目的 UI 组件。
/// 由 InteractionUIPage 生成并驱动。
/// 支持三种视觉状态:普通、高亮(选中)、不可用(灰色)。
/// </summary>
public class InteractionChoiceItem : UIElementBase
{
[SerializeField] private TMP_Text labelText;
[Tooltip("普通状态下的背景(可选)。")]
[SerializeField] private Image backgroundImage;
[Tooltip("高亮指示器,例如左侧箭头图标(当选中时显示)。")]
[SerializeField] private GameObject highlightIndicator;
[Header("颜色配置")]
[SerializeField] private Color normalColor = Color.white;
[SerializeField] private Color highlightedColor = new Color(0.4f, 1f, 1f); // 青色
[SerializeField] private Color disabledColor = new Color(0.45f, 0.45f, 0.45f); // 灰色
private bool _isInteractable = true;
// ====================================================================
// 对外接口
// ====================================================================
/// <summary>
/// 初始化条目内容。由 InteractionUIPage 在 Show() 时调用。
/// </summary>
/// <param name="choiceName">选项名称。</param>
/// <param name="isInteractable">false 时以灰色显示且不可高亮。</param>
public void Setup(string choiceName, bool isInteractable)
{
_isInteractable = isInteractable;
if (labelText != null)
{
labelText.text = choiceName;
labelText.color = isInteractable ? normalColor : disabledColor;
}
if (highlightIndicator != null)
{
highlightIndicator.SetActive(false);
}
}
/// <summary>
/// 设置高亮状态。由 InteractionUIPage.UpdateHighlight() 调用。
/// 不可交互的选项不会显示高亮。
/// </summary>
public void SetHighlighted(bool highlighted)
{
bool showHighlight = highlighted && _isInteractable;
if (highlightIndicator != null)
{
highlightIndicator.SetActive(showHighlight);
}
if (labelText != null)
{
if (!_isInteractable)
{
labelText.color = disabledColor;
}
else
{
labelText.color = showHighlight ? highlightedColor : normalColor;
}
}
}
}
}