En este tutorial, aprenderás a hacer que un enemigo con NavMeshAgent
se detenga cuando colisione con el jugador. Esto es útil para implementar eventos como:
✅ El enemigo deja de moverse cuando atrapa al jugador.
✅ Se puede activar un Game Over o animaciones personalizadas.
✅ Funciona con NavMeshAgent
y OnTriggerEnter()
.
🔹 1. Configurar el Enemigo y el Jugador Correctamente
Para que la detección de colisiones funcione, es necesario que el jugador y el enemigo tengan Collider
y Rigidbody
.
📌 Paso 1: Configurar el Jugador
- Selecciona el
Jugador
en la Jerarquía (Hierarchy
). - Asegura que tiene un
Rigidbody
(Add Component > Rigidbody
).- Marca
Is Kinematic
✅ (si el jugador no usa física). - Desactiva
Use Gravity
si el jugador no debe caer.
- Marca
- Asegura que tiene un
Collider
(BoxCollider
,CapsuleCollider
, etc.). - Dale el
Tag
"Player"
(Inspector > Tag > Player
).
📌 Paso 2: Configurar el Enemigo
- Selecciona el
Enemigo
en la Jerarquía. - Asegura que tiene un
NavMeshAgent
(Add Component > NavMeshAgent
). - Asegura que tiene un
Collider
(BoxCollider
,CapsuleCollider
, etc.). - Marca
Is Trigger
en elCollider
✅ (para usarOnTriggerEnter
). - Dale el
Tag
"Enemigo"
(Inspector > Tag > Enemigo
).
🔹 2. Modificar el Script del Enemigo
📌 Paso 3: Detener el NavMeshAgent
al Colisionar
Modifica el script de la IA del enemigo (EnemigoPersecucion.cs
) para que detenga su movimiento al tocar al jugador.
using UnityEngine;
using UnityEngine.AI;
public class EnemigoPersecucion : MonoBehaviour
{
public Transform objetivo; // Referencia al jugador
private NavMeshAgent agente;
private Animator animator;
void Start()
{
agente = GetComponent<NavMeshAgent>();
animator = GetComponent<Animator>();
if (objetivo == null)
{
Debug.LogError("⚠️ No se ha asignado el jugador como objetivo en el Inspector.");
}
}
void Update()
{
if (objetivo != null && agente.enabled)
{
// Perseguir al jugador
agente.SetDestination(objetivo.position);
}
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player")) // Verifica si tocó al jugador
{
Debug.Log("¡El enemigo atrapó al jugador! Deteniendo IA.");
// Detener el movimiento del enemigo
agente.isStopped = true;
agente.enabled = false; // Desactivar NavMeshAgent
// Opcional: Activar animación de ataque
if (animator != null)
{
animator.SetTrigger("Atacar");
}
// Opcional: Llamar a Game Over
GameOverManager gameOver = FindObjectOfType<GameOverManager>();
if (gameOver != null)
{
gameOver.ActivarGameOver();
}
}
}
}
🔹 3. Asignar el Script al Enemigo
- Selecciona el
Enemigo
en la Jerarquía. - Arrástrale el script
EnemigoPersecucion.cs
(Add Component > EnemigoPersecucion
). - Arrastra el
Jugador
al campoObjetivo
en elInspector
.
🎯 Resultado Final
✅ El enemigo persigue al jugador normalmente.
✅ Cuando lo toca, se detiene completamente (NavMeshAgent
desactivado).
✅ Opcionalmente, puede activar una animación de ataque o Game Over.
