81 lines
2.1 KiB
C#
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);
|
|
}
|
|
}
|