using UnityEngine; using UnityEngine.Events; /// /// 미니게임 성공, 퀘스트 완료, 버튼 이벤트 등에서 아이템을 지급할 때 사용합니다. /// 예: 낚시 성공 이벤트 -> ItemReward.GiveReward() /// [DisallowMultipleComponent] public class ItemReward : MonoBehaviour { [Header("Reference")] [SerializeField] private InventoryManager inventoryManager; [Header("Reward")] [SerializeField] private InventoryItemType rewardItemType = InventoryItemType.Fish; [SerializeField] private int rewardAmount = 1; [SerializeField] private bool giveOnlyOnce = false; [Header("Auto Find")] [SerializeField] private bool autoFindManager = true; [Header("Events")] public UnityEvent onRewardGiven; public UnityEvent onRewardAlreadyGiven; [Header("Debug")] [SerializeField] private bool showDebugLog = true; private bool alreadyGiven; private void Awake() { if (inventoryManager == null && autoFindManager) inventoryManager = FindFirstObjectByType(); } public void GiveReward() { if (giveOnlyOnce && alreadyGiven) { onRewardAlreadyGiven?.Invoke(); if (showDebugLog) Debug.Log("[ItemReward] 이미 지급된 아이템 보상입니다."); return; } if (inventoryManager == null) { Debug.LogWarning("[ItemReward] InventoryManager가 연결되지 않았습니다."); return; } int amount = Mathf.Max(1, rewardAmount); inventoryManager.AddItem(rewardItemType, amount); alreadyGiven = true; onRewardGiven?.Invoke(); if (showDebugLog) Debug.Log($"[ItemReward] {rewardItemType} +{amount}"); } public void GiveRewardAmount(int amount) { rewardAmount = Mathf.Max(1, amount); GiveReward(); } public void ResetRewardState() { alreadyGiven = false; } public void SetRewardItemType(InventoryItemType itemType) { rewardItemType = itemType; } public void SetInventoryManager(InventoryManager manager) { inventoryManager = manager; } }