91 lines
2.1 KiB
C#
91 lines
2.1 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
using Arena.Characters;
|
|
|
|
namespace Arena.Interactions
|
|
{
|
|
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);
|
|
}
|
|
}
|
|
}
|