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(); 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(); if (movementController != null) { movementController.Stop(); return; } // Fallback to NavMeshAgent UnityEngine.AI.NavMeshAgent agent = target.GetComponent(); if (agent != null) { agent.isStopped = true; agent.ResetPath(); } } }