108 lines
2.7 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|