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
Jugadoren la Jerarquía (Hierarchy). - Asegura que tiene un
Rigidbody(Add Component > Rigidbody).- Marca
Is Kinematic✅ (si el jugador no usa física). - Desactiva
Use Gravitysi 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
Enemigoen la Jerarquía. - Asegura que tiene un
NavMeshAgent(Add Component > NavMeshAgent). - Asegura que tiene un
Collider(BoxCollider,CapsuleCollider, etc.). - Marca
Is Triggeren 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
Enemigoen la Jerarquía. - Arrástrale el script
EnemigoPersecucion.cs(Add Component > EnemigoPersecucion). - Arrastra el
Jugadoral campoObjetivoen 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.
