using System.Collections;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
///
/// 인벤토리 슬롯 하나를 담당하는 UI 스크립트입니다.
/// FishSlot, CompassSlot, TrashSlot, BottleSlot 등에 각각 붙입니다.
///
[DisallowMultipleComponent]
public class InventorySlotUI : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, ISelectHandler, IDeselectHandler
{
[Header("Item")]
[SerializeField] private InventoryItemType itemType;
[Header("UI References")]
[SerializeField] private Image slotBackground;
[SerializeField] private Image itemIcon;
[SerializeField] private TMP_Text countText;
[SerializeField] private GameObject newBadge;
[SerializeField] private CanvasGroup canvasGroup;
[Header("Tooltip")]
[SerializeField] private InventoryTooltipUI tooltipUI;
[Header("Settings")]
[SerializeField] private bool hideWhenZero = false;
[SerializeField] private bool dimWhenZero = true;
[SerializeField] private float zeroAlpha = 0.35f;
[SerializeField] private float ownedAlpha = 1f;
[SerializeField] private float newBadgeShowTime = 1.2f;
private int currentCount;
private Coroutine newBadgeRoutine;
public InventoryItemType ItemType => itemType;
public int CurrentCount => currentCount;
private void Awake()
{
if (canvasGroup == null)
canvasGroup = GetComponent();
if (newBadge != null)
newBadge.SetActive(false);
}
public void SetItemType(InventoryItemType newItemType)
{
itemType = newItemType;
}
public void SetCount(int count, bool showNewBadge)
{
int previousCount = currentCount;
currentCount = Mathf.Max(0, count);
UpdateVisualState();
if (showNewBadge && currentCount > previousCount)
ShowNewBadge();
}
public void SetIcon(Sprite sprite)
{
if (itemIcon == null)
return;
itemIcon.sprite = sprite;
itemIcon.enabled = sprite != null;
}
public void SetSlotBackground(Sprite sprite)
{
if (slotBackground == null)
return;
slotBackground.sprite = sprite;
slotBackground.enabled = sprite != null;
}
public void ShowNewBadge()
{
if (newBadge == null)
return;
if (newBadgeRoutine != null)
StopCoroutine(newBadgeRoutine);
newBadgeRoutine = StartCoroutine(NewBadgeRoutine());
}
public void HideNewBadge()
{
if (newBadgeRoutine != null)
{
StopCoroutine(newBadgeRoutine);
newBadgeRoutine = null;
}
if (newBadge != null)
newBadge.SetActive(false);
}
private IEnumerator NewBadgeRoutine()
{
newBadge.SetActive(true);
yield return new WaitForSeconds(newBadgeShowTime);
newBadge.SetActive(false);
newBadgeRoutine = null;
}
private void UpdateVisualState()
{
bool hasItem = currentCount > 0;
if (countText != null)
countText.text = $"x{currentCount}";
if (hideWhenZero)
gameObject.SetActive(hasItem);
if (canvasGroup != null && dimWhenZero)
canvasGroup.alpha = hasItem ? ownedAlpha : zeroAlpha;
}
public void OnPointerEnter(PointerEventData eventData)
{
ShowTooltip();
}
public void OnPointerExit(PointerEventData eventData)
{
HideTooltip();
}
public void OnSelect(BaseEventData eventData)
{
ShowTooltip();
}
public void OnDeselect(BaseEventData eventData)
{
HideTooltip();
}
public void ShowTooltip()
{
if (tooltipUI != null)
tooltipUI.ShowTooltip(itemType, currentCount);
}
public void HideTooltip()
{
if (tooltipUI != null)
tooltipUI.HideTooltip();
}
}