using System; using System.Reflection; using UnityEngine; using UnityEngine.Events; public class TruthFountainReward : MonoBehaviour { [Header("Reward Control")] [SerializeField] private bool giveOnlyOnce = true; [Header("Optional Auto Call")] [Tooltip("MemoryPieceReward 같은 컴포넌트를 넣고 methodName을 GiveReward로 두면 성공 시 자동 호출됩니다. 비워두고 Events에 직접 연결해도 됩니다.")] [SerializeField] private MonoBehaviour rewardReceiver; [SerializeField] private string rewardMethodName = "GiveReward"; [Header("Events")] public UnityEvent onRewardGiven; public UnityEvent onRewardAlreadyGiven; [Header("Debug")] [SerializeField] private bool showDebugLog = true; private bool alreadyGiven; public bool AlreadyGiven => alreadyGiven; public void GiveReward() { if (giveOnlyOnce && alreadyGiven) { onRewardAlreadyGiven?.Invoke(); if (showDebugLog) { Debug.Log($"[{nameof(TruthFountainReward)}] 이미 지급된 진실의 샘 보상입니다."); } return; } TryCallRewardReceiver(); alreadyGiven = true; onRewardGiven?.Invoke(); if (showDebugLog) { Debug.Log($"[{nameof(TruthFountainReward)}] 진실의 샘 보상을 지급했습니다."); } } public void ResetReward() { alreadyGiven = false; } private void TryCallRewardReceiver() { if (rewardReceiver == null || string.IsNullOrWhiteSpace(rewardMethodName)) { return; } MethodInfo method = rewardReceiver.GetType().GetMethod( rewardMethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null ); if (method == null) { Debug.LogWarning($"[{nameof(TruthFountainReward)}] {rewardReceiver.name}에서 {rewardMethodName}() 메서드를 찾지 못했습니다."); return; } method.Invoke(rewardReceiver, null); } }