🎮 UnityDocs

IA con NavMesh: enemigos que persiguen

Cómo hacer que un enemigo navegue por el escenario esquivando obstáculos con el sistema NavMesh y NavMeshAgent. Perseguir, patrullar y el cambio de flujo en Unity 6 (paquete AI Navigation).

📄 ArtículoAvanzado✅ RevisadoUnity 6.0 LTSActualizado 2026-07-15
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 8 min · ⌨️ Práctica 30 min

Qué es el NavMesh#

Hacer que un enemigo vaya del punto A al B esquivando paredes, muebles y desniveles es el problema del pathfinding. El sistema NavMesh (malla de navegación) lo resuelve: Unity "hornea" una malla invisible sobre el escenario que marca por dónde se puede caminar, y un componente NavMeshAgent calcula la ruta automáticamente sobre ella.

Cambio importante en Unity 6: paquete AI Navigation

En Unity moderno, el NavMesh se gestiona con el paquete AI Navigation (instálalo desde el Package Manager). En lugar de la vieja ventana Window → AI → Navigation, añades un componente NavMeshSurface al suelo/escenario y pulsas Bake. Los tutoriales antiguos usan el flujo viejo, que ya no es el recomendado. Si no encuentras "NavMeshSurface", te falta instalar el paquete.

Preparar la navegación#

  1. Instala el paquete AI Navigation.
  2. Añade un componente NavMeshSurface (normalmente al suelo o a un objeto raíz del escenario).
  3. Marca los objetos estáticos que forman el nivel y pulsa Bake: verás la malla azul sobre las zonas caminables.
  4. Al enemigo, añádele un componente NavMeshAgent.

Perseguir al jugador#

C#
using UnityEngine;
using UnityEngine.AI;   // necesario para NavMesh

[RequireComponent(typeof(NavMeshAgent))]
public class EnemigoIA : MonoBehaviour
{
    [SerializeField] private Transform objetivo;      // el jugador
    [SerializeField] private float rangoDeteccion = 15f;

    private NavMeshAgent agente;

    void Awake() => agente = GetComponent<NavMeshAgent>();

    void Update()
    {
        if (objetivo == null) return;

        float distancia = Vector3.Distance(transform.position, objetivo.position);
        if (distancia <= rangoDeteccion)
            agente.SetDestination(objetivo.position);   // ¡persíguelo!
        else
            agente.ResetPath();                         // deja de perseguir
    }
}

SetDestination es toda la magia: le das un punto y el agente calcula y sigue la ruta, esquivando obstáculos, solo.

Patrullar entre puntos#

C#
using UnityEngine;
using UnityEngine.AI;

public class Patrulla : MonoBehaviour
{
    [SerializeField] private Transform[] puntos;
    private NavMeshAgent agente;
    private int indice;

    void Awake() => agente = GetComponent<NavMeshAgent>();
    void Start() => Ir();

    void Update()
    {
        // Cuando casi llega al punto, pasa al siguiente
        if (!agente.pathPending && agente.remainingDistance < 0.5f)
        {
            indice = (indice + 1) % puntos.Length;
            Ir();
        }
    }

    void Ir() => agente.SetDestination(puntos[indice].position);
}

Combínalo con una máquina de estados#

Perseguir y patrullar son dos comportamientos: el candidato perfecto para una máquina de estados. El enemigo patrulla hasta que ve al jugador (estado Patrullar → Perseguir), y usa un raycast para comprobar la línea de visión real (no basta la distancia; puede haber una pared en medio).

Distancia no es lo mismo que ver

Que el jugador esté cerca no significa que el enemigo lo vea: puede haber un muro. Combina la distancia con un Physics.Raycast (o Linecast) hacia el jugador para confirmar la línea de visión antes de perseguir. Es lo que separa una IA creíble de una que "ve a través de las paredes".

Ajustes útiles del NavMeshAgent#

  • Speed / Angular Speed / Acceleration: cómo de rápido se mueve y gira.
  • Stopping Distance: a qué distancia del objetivo se detiene (para no empujarlo).
  • Obstacle Avoidance: cómo esquiva a otros agentes.

Para obstáculos que se mueven (una puerta, una caja), usa un NavMeshObstacle en ellos.

Errores frecuentes#

  • No hornear (Bake) la malla: el agente no se mueve (no hay suelo navegable).
  • Buscar la vieja ventana Navigation en vez de usar NavMeshSurface (Unity 6).
  • Perseguir solo por distancia sin comprobar línea de visión (ve a través de muros).
  • Mover al enemigo con transform/Rigidbody a la vez que el agente (se pelean; deja mover al agente).
  • Puntos de patrulla fuera de la malla horneada (el agente no puede llegar).

Ponte a prueba#

📝 Pon a prueba lo aprendido

Resumen#

El NavMesh marca por dónde se puede caminar y el NavMeshAgent calcula rutas con SetDestination. En Unity 6 se usa el paquete AI Navigation con NavMeshSurface + Bake. Persigue comprobando distancia y línea de visión (raycast), patrulla recorriendo puntos, y organiza los comportamientos con una máquina de estados.

Fuentes y para profundizar