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.Stopdetiene el movimiento y pone la velocidad en cero, conservando la ruta calculada. No indica llegada salvo que la ruta ya se hubiera completado.IsOnNavMeshyGetRemainingDistanceusan 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.