Files
Arena/Assets/_Content/Scripts/Characters/PlayerEvent.cs

90 lines
2.1 KiB
C#

using UnityEngine;
using UnityEngine.Events;
namespace Arena.Characters
{
public class PlayerEvent : MonoBehaviour
{
public enum Trigger
{
OnPlayerEnter,
OnPlayerInteract
}
[System.Serializable]
public class Settings
{
[Tooltip("OnPlayerEnter: as soon as the player enters. OnPlayerInteract: when the player interacts inside the zone.")]
public Trigger Trigger;
}
[SerializeField] private Settings _settings;
[SerializeField] private UnityEvent _onPlayer;
private bool _isListening;
#region UNITY LIFECYCLES
private void OnDisable()
{
// The object can be hidden while the player is inside
StopListening();
}
void OnTriggerEnter(Collider other)
{
if (!IsPlayer(other))
return;
if (_settings.Trigger == Trigger.OnPlayerEnter)
_onPlayer.Invoke();
else
StartListening();
}
void OnTriggerExit(Collider other)
{
if (IsPlayer(other))
StopListening();
}
#endregion
private bool IsPlayer(Collider other)
{
return Player.Instance != null && other.gameObject == Player.Instance.gameObject;
}
private void StartListening()
{
Player.Instance.OnInteract += HandleInteract;
_isListening = true;
}
private void StopListening()
{
if (!_isListening)
return;
if (Player.Instance != null)
Player.Instance.OnInteract -= HandleInteract;
_isListening = false;
}
private void HandleInteract()
{
_onPlayer.Invoke();
}
public void Teleport(Transform target)
{
if (!Player.Instance)
return;
StopListening();
Player.Instance.Teleport(target);
}
}
}