Saltar al contenido principal

NavMesh y NavMeshAgent

NavMesh consulta un grafo de navegación precalculado. NavMeshAgent mueve un GameObject raíz con un componente de agente habilitado y una superficie asignada habilitada. Los Navigation Links explícitos pueden conectar esa superficie con otras.

Consultas de ruta​

NavMesh.FindPath(sx, sy, sz, ex, ey, ez) devuelve una tabla de puntos Vec3. Un resultado exitoso está completo y contiene como máximo 32 puntos. Una tabla vacía indica que no hay una ruta completa que respete el grafo y el límite de puntos.

Los extremos deben estar cerca de una muestra precalculada: dentro de media diagonal de celda horizontalmente y de la mitad de Cell Height verticalmente, con una tolerancia vertical mínima de 0.05 unidades. También se admiten posiciones sobre una conexión precalculada. El último punto es un nodo del grafo, no la posición original del mundo sin comprobar. Un punto arbitrario fuera del grafo se rechaza en lugar de añadirse al final de la ruta.

NavMesh.SamplePosition(x, y, z, maxDistance[, surfaceGameObjectId]) devuelve found, sampleX, sampleY, sampleZ. Busca el nodo más cercano dentro de la distancia 3D indicada. Su ID de superficie opcional limita la búsqueda a esa superficie exacta. Encontrar una muestra no demuestra que el agente pueda llegar hasta ella; comprueba también el resultado de NavMeshAgent.SetDestination.

Movimiento del agente​

Asigna este script al GameObject raíz que tiene el agente. Configura el ID del GameObject objetivo en sus propiedades Lua. Una distancia de proyección pequeña ayuda cuando el objetivo está entre muestras de la cuadrícula; evita un valor tan grande que pueda seleccionar otro piso.

targetGameObjectId = -1
projectionDistance = 0.75

function Start(gameObjectId)
if targetGameObjectId < 0 then
Log.Print("Assign a target GameObject first.")
return
end

local target = Transform.GetPosition(targetGameObjectId)
if target == nil then
return
end
local found, x, y, z = NavMesh.SamplePosition(
target.x, target.y, target.z, projectionDistance)

if not found or not NavMeshAgent.SetDestination(gameObjectId, x, y, z) then
NavMeshAgent.Stop(gameObjectId)
Log.Print("No complete navigation route to this target.")
end
end

Solicita un destino cuando cambie el objetivo, no en cada frame: una solicitud exitosa reinicia la ruta y su aceleración. Una solicitud fallida devuelve false y conserva la ruta anterior. Llama a NavMeshAgent.Stop si el fallo debe cancelar el movimiento, como hace el ejemplo.

Las consultas incluyen IsMoving, HasPath, HasReachedDestination, IsOnNavMesh, GetRemainingDistance, GetSpeed y GetPathStatus. NavMeshAgent.PathComplete significa que se calculó una ruta completa; NavMeshAgent.PathInvalid indica que no se posee una ruta válida.

  • Una aceleración de cero aplica inmediatamente la velocidad configurada.
  • Stopping Distance se aplica al último punto. Los puntos intermedios usan una tolerancia pequeña.
  • NavMeshAgent.Stop detiene el movimiento y pone la velocidad en cero, conservando la ruta calculada. No indica llegada salvo que la ruta ya se hubiera completado.
  • IsOnNavMesh y GetRemainingDistance usan la posición actual del GameObject.
  • Si otro script mueve un agente activo, la navegación recalcula desde esa posición hasta el objetivo existente en su siguiente actualización. Si no puede llegar, detiene el movimiento e invalida la ruta.
  • Los agentes deshabilitados se detienen y descartan su ruta activa en la siguiente actualización de navegación. Solicita un destino nuevo después de habilitarlos.

Superficies conectadas y límites​

La superficie asignada establece la red de navegación del agente. El agente puede usar superficies alcanzables mediante Navigation Links dirigidos explícitos. Un enlace de una sola dirección no permite el regreso, y las superficies desconectadas siguen siendo inaccesibles. NavMesh.SamplePosition conserva su filtro opcional de superficie exacta.

El grafo es estático: se calcula al entrar en Play Mode y durante la exportación para PS1. Mover una pared o cambiar la geometría de navegación durante el juego no lo reconstruye. La navegación modifica el Transform raíz y no proporciona evasión de obstáculos dinámicos, respuesta física de colisiones, animaciones de salto ni movimiento por escaleras de mano. Usa un solo responsable del movimiento del agente, en lugar de moverlo también con un Character Controller u otro script.

Consulta Habitaciones, portales y navegación para ver la configuración, los parámetros, los enlaces y la solución de problemas.