90 lines
2.3 KiB
C#
90 lines
2.3 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
using UnityEngine.Serialization;
|
|
|
|
namespace R0bbie.Timeline.Events
|
|
{
|
|
/// <summary>
|
|
/// Register to the linked GameEvent scriptable object, and trigger any function assign to the unity event
|
|
/// </summary>
|
|
[AddComponentMenu("Timeline/Game Events/Event Listener")]
|
|
public class GameEventListener : MonoBehaviour, IGameEventListener
|
|
{
|
|
// Exposed Variables
|
|
|
|
[Header("Event Listener")]
|
|
public bool registerAutomatically = true;
|
|
public bool triggerOnce;
|
|
|
|
[Space(10)]
|
|
[FormerlySerializedAs("animationStateEvent")]
|
|
public GameEvent gameEvent;
|
|
public UnityEvent response = new UnityEvent();
|
|
|
|
// Private Variables
|
|
|
|
bool registered;
|
|
bool triggered;
|
|
|
|
|
|
void OnEnable()
|
|
{
|
|
if (!gameEvent)
|
|
return;
|
|
|
|
// If is not set to registered automatically, and haven't been registered yet, do nothing
|
|
if (!registerAutomatically && !registered)
|
|
return;
|
|
|
|
// If already triggered, do nothing
|
|
if (triggerOnce && triggered)
|
|
return;
|
|
|
|
Register();
|
|
}
|
|
|
|
|
|
void OnDisable()
|
|
{
|
|
// If there is no game event attached at the moment the object is disabled, do nothing
|
|
if (!gameEvent)
|
|
return;
|
|
|
|
// Unregister listener but remember status
|
|
gameEvent.UnregisterListener(this);
|
|
}
|
|
|
|
|
|
public void OnEventRaised()
|
|
{
|
|
// If for some reason the event is still registered when it shouldn't, do nothing
|
|
if (triggerOnce && triggered)
|
|
return;
|
|
|
|
triggered = true;
|
|
|
|
response?.Invoke();
|
|
|
|
// Unregister and disable to avoid calling onDisable when unloading the level
|
|
if (triggerOnce)
|
|
Unregister();
|
|
}
|
|
|
|
|
|
public void Register()
|
|
{
|
|
gameEvent.RegisterListener(this);
|
|
registered = true;
|
|
}
|
|
|
|
|
|
public void Unregister()
|
|
{
|
|
gameEvent.UnregisterListener(this);
|
|
registered = false;
|
|
}
|
|
|
|
|
|
}
|
|
}
|