🎮 UnityDocs

SetDestination can only be called on an active agent on a NavMesh

El error del NavMeshAgent que no está sobre la malla: por qué pasa (no horneaste, el agente aparece fuera de la malla, offset en Y) y cómo colocarlo bien con SamplePosition.

🐛 ErrorIntermedio✅ RevisadoUnity 6.0 LTSActualizado 2026-07-15
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 5 min

El mensaje#

texto
"SetDestination" can only be called on an active agent that has been
placed on a NavMesh.

Qué significa#

Tu NavMeshAgent intenta calcular una ruta, pero no está apoyado sobre la malla de navegación. El agente necesita "tocar" la NavMesh horneada para moverse; si está flotando, hundido o fuera de ella, no puede.

Las causas típicas#

1. No has horneado la NavMesh#

Sin malla, no hay dónde caminar. Instala el paquete AI Navigation, añade un NavMeshSurface al escenario y pulsa Bake. Deberías ver la malla azul sobre el suelo. Ver IA con NavMesh.

Unity 6: NavMeshSurface, no la vieja ventana

Si buscas la ventana Window → AI → Navigation y no bakea, es porque en Unity moderno se usa el componente NavMeshSurface del paquete AI Navigation. Los tutoriales antiguos usan el flujo viejo.

2. El agente aparece fuera o encima de la malla#

Es la causa más común en runtime: instancias un enemigo con Instantiate en una posición que no está sobre la NavMesh (un poco elevado, sobre un hueco, fuera del área horneada). Aunque sea por unos centímetros en Y, el agente no "engancha".

3. El agente se mueve por otro medio#

Si mueves el objeto con transform.position o un Rigidbody a la vez que tiene NavMeshAgent, pueden pelearse y sacarlo de la malla. Deja que el agente lo mueva.

La solución: colocarlo sobre la malla#

Al aparecer, "engancha" el agente a la malla más cercana con NavMesh.SamplePosition:

C#
using UnityEngine;
using UnityEngine.AI;

public class ColocarEnNavMesh : MonoBehaviour
{
    void Start()
    {
        var agente = GetComponent<NavMeshAgent>();

        // Busca el punto de la NavMesh más cercano (en un radio de 2 m)
        if (NavMesh.SamplePosition(transform.position, out NavMeshHit hit, 2f, NavMesh.AllAreas))
        {
            agente.Warp(hit.position);   // coloca el agente exactamente sobre la malla
        }
        else
        {
            Debug.LogWarning("No hay NavMesh cerca de " + transform.position);
        }
    }
}
Warp en vez de mover el transform

Para teletransportar un NavMeshAgent (al aparecer, al reaparecer en un checkpoint), usa agente.Warp(posicion), no transform.position. Warp reubica el agente manteniéndolo enganchado a la malla; mover el transform a pelo puede dejarlo "fuera" y provocar justo este error.

Comprobar antes de dar una orden#

Blinda las llamadas comprobando que el agente está listo:

C#
if (agente.isOnNavMesh)
    agente.SetDestination(objetivo.position);

Errores frecuentes#

  • No haber horneado la NavMesh (no hay malla).
  • Instanciar enemigos en posiciones que no están sobre la malla (offset en Y, fuera del área).
  • Mover el agente con transform/Rigidbody en vez de dejar que él se mueva.
  • Teletransportar con transform.position en vez de Warp.
  • Puntos de destino fuera de la malla horneada.

Resumen#

El error significa que el NavMeshAgent no está sobre la NavMesh. Asegúrate de hornear (NavMeshSurface + Bake en Unity 6), de que el agente aparezca sobre la malla (usa NavMesh.SamplePosition + agente.Warp al instanciar), de no moverlo con transform/Rigidbody, y comprueba agente.isOnNavMesh antes de SetDestination. Repasa el flujo en IA con NavMesh.

Fuentes y para profundizar