2026-06-19 UI, UI로직
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user