Files
2026-03-03 05:27:03 +05:00

108 lines
2.8 KiB
C#

using Newtonsoft.Json.Linq;
using ThunderWire.Attributes;
using UnityEngine;
using UnityEngine.Events;
namespace UHFPS.Runtime
{
[InspectorHeader("Hint Trigger")]
public class HintTrigger : MonoBehaviour, ISaveable
{
public enum TriggerTypeEnum { TriggerEnter, TriggerExit, Event }
public TriggerTypeEnum TriggerType = TriggerTypeEnum.TriggerEnter;
public GString HintMessage;
public float MessageTime;
[Header("Settings")]
public bool ShowMoreTimes;
public bool CallEventOnce;
[Header("Events")]
public UnityEvent OnHintShowed;
private bool isTriggered;
private bool isEventCalled;
private bool triggerEntered;
private GameManager gameManager;
private void Awake()
{
gameManager = GameManager.Instance;
}
private void Start()
{
HintMessage.SubscribeGloc();
}
private void OnTriggerEnter(Collider other)
{
if (TriggerType == TriggerTypeEnum.Event)
return;
if (other.CompareTag("Player") && !isTriggered && !triggerEntered)
{
if (TriggerType == TriggerTypeEnum.TriggerEnter)
{
TriggerHint();
}
else if (TriggerType == TriggerTypeEnum.TriggerExit)
{
triggerEntered = true;
}
}
}
private void OnTriggerExit(Collider other)
{
if (TriggerType == TriggerTypeEnum.Event)
return;
if (other.CompareTag("Player") && !isTriggered && triggerEntered)
{
if (TriggerType == TriggerTypeEnum.TriggerExit)
{
TriggerHint();
}
}
}
public void TriggerHint()
{
if (isTriggered)
return;
gameManager.ShowHintMessage(HintMessage, MessageTime);
if (!isEventCalled)
{
OnHintShowed?.Invoke();
isEventCalled = ShowMoreTimes && CallEventOnce;
}
isTriggered = !ShowMoreTimes;
}
public void DisableTrigger()
{
isTriggered = true;
}
public StorableCollection OnSave()
{
return new StorableCollection()
{
{ nameof(isTriggered), isTriggered },
{ nameof(isEventCalled), isEventCalled },
};
}
public void OnLoad(JToken data)
{
isTriggered = (bool)data[nameof(isTriggered)];
isEventCalled = (bool)data[nameof(isEventCalled)];
}
}
}