Files
WhaleAdventure_VR/Assets/My project/TruthFountain/Scripts/TruthFountainReward.cs
skrwns304@gmail.com b1e85a5b89 2026-06-19 UI, UI로직
2026-06-19 14:27:40 +09:00

81 lines
2.1 KiB
C#

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);
}
}