Files
Click-PointRPG/Assets/Scripts/TriggerEvents.cs

108 lines
2.7 KiB
C#

using UnityEngine;
using UnityEngine.Events;
[DisallowMultipleComponent]
[RequireComponent(typeof(Collider))]
public class TriggerEvents : MonoBehaviour
{
[Header("Trigger Conditions")]
[Tooltip("Only trigger once for all events")]
public bool triggerOnce = true;
[Tooltip("Destroy this GameObject after triggering")]
public bool destroyAfterTrigger = false;
[Tooltip("Stop player movement when triggered")]
public bool stopPlayerMovement = true;
[Tooltip("Tag required to trigger (leave empty to ignore)")]
public string requiredTag = "Player";
[Tooltip("Layer mask required to trigger")]
public LayerMask requiredLayers = ~0;
[Header("Events")]
public UnityEvent onEnter;
public UnityEvent onExit;
public UnityEvent onStay;
private bool hasTriggered = false;
private void Reset()
{
Collider collider = GetComponent<Collider>();
if (collider != null)
{
collider.isTrigger = true;
}
}
private void OnTriggerEnter(Collider other)
{
if (!CanTrigger(other)) return;
hasTriggered = true;
// Stop player movement if enabled
if (stopPlayerMovement)
{
StopMovement(other.gameObject);
}
onEnter?.Invoke();
if (destroyAfterTrigger)
{
Destroy(gameObject);
}
}
private void OnTriggerExit(Collider other)
{
if (!CanTrigger(other)) return;
onExit?.Invoke();
}
private void OnTriggerStay(Collider other)
{
if (!CanTrigger(other)) return;
onStay?.Invoke();
}
private bool CanTrigger(Collider other)
{
if (other == null) return false;
if (triggerOnce && hasTriggered) return false;
if (!string.IsNullOrEmpty(requiredTag) && !other.CompareTag(requiredTag))
{
return false;
}
int otherLayerMask = 1 << other.gameObject.layer;
if ((requiredLayers.value & otherLayerMask) == 0)
{
return false;
}
return true;
}
private void StopMovement(GameObject target)
{
if (target == null) return;
// Try NavMeshMovementController first
NavMeshMovementController movementController = target.GetComponent<NavMeshMovementController>();
if (movementController != null)
{
movementController.Stop();
return;
}
// Fallback to NavMeshAgent
UnityEngine.AI.NavMeshAgent agent = target.GetComponent<UnityEngine.AI.NavMeshAgent>();
if (agent != null)
{
agent.isStopped = true;
agent.ResetPath();
}
}
}