Files
2026-06-22 16:18:34 +02:00

101 lines
3.0 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using TMPro;
using DG.Tweening;
using System;
namespace Ashwild.Crafting
{
public class RecipeButtonUI : MonoBehaviour
{
[Header("References")]
[SerializeField] private Button selectButton;
[SerializeField] private Image iconImage;
[SerializeField] private TextMeshProUGUI nameText;
[SerializeField] private Button minusButton;
[SerializeField] private Button plusButton;
[SerializeField] private Image highlightImage;
[SerializeField] private CanvasGroup canvasGroup;
[Header("Animation")]
[SerializeField] private float selectedScale = 1.05f;
[SerializeField] private float scaleDuration = 0.15f;
[SerializeField] private Ease scaleEase = Ease.OutQuad;
private CraftingRecipe recipe;
private int craftCount = 1;
private Action<RecipeButtonUI> onSelected;
private Action<RecipeButtonUI> onCountChanged;
private Tweener scaleTween;
public CraftingRecipe Recipe => recipe;
public int CraftCount => craftCount;
public void Initialize(CraftingRecipe recipe, Action<RecipeButtonUI> onSelected, Action<RecipeButtonUI> onCountChanged)
{
this.recipe = recipe;
this.onSelected = onSelected;
this.onCountChanged = onCountChanged;
iconImage.sprite = recipe.Icon;
nameText.text = recipe.RecipeName;
craftCount = 1;
selectButton.onClick.AddListener(() => onSelected?.Invoke(this));
minusButton.onClick.AddListener(OnMinus);
plusButton.onClick.AddListener(OnPlus);
if (highlightImage != null)
highlightImage.gameObject.SetActive(false);
minusButton.gameObject.SetActive(false);
plusButton.gameObject.SetActive(false);
}
public void SetSelected(bool selected)
{
if (highlightImage != null)
highlightImage.gameObject.SetActive(selected);
minusButton.gameObject.SetActive(selected);
plusButton.gameObject.SetActive(selected);
scaleTween?.Kill();
float target = selected ? selectedScale : 1f;
scaleTween = transform.DOScale(target, scaleDuration).SetEase(scaleEase).SetUpdate(true);
if (!selected)
craftCount = 1;
}
public void ResetCount()
{
craftCount = 1;
onCountChanged?.Invoke(this);
}
public void UpdateCraftability(bool canCraft)
{
canvasGroup.alpha = canCraft ? 1f : 0.5f;
}
private void OnMinus()
{
if (craftCount <= 1) return;
craftCount--;
onCountChanged?.Invoke(this);
}
private void OnPlus()
{
craftCount++;
onCountChanged?.Invoke(this);
}
private void OnDestroy()
{
scaleTween?.Kill();
}
}
}