Working on quests, moved to CineMachine for camera and started to build out areas, started combat system
This commit is contained in:
107
Assets/Scripts/TriggerEvents.cs
Normal file
107
Assets/Scripts/TriggerEvents.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user