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 onSelected; private Action onCountChanged; private Tweener scaleTween; public CraftingRecipe Recipe => recipe; public int CraftCount => craftCount; public void Initialize(CraftingRecipe recipe, Action onSelected, Action 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(); } } }