Navmesh y colisión
Las navmeshes definen el espacio caminable para la búsqueda de rutas y las restricciones de movimiento.
Las mallas de navegación definen las áreas transitables en tu mundo. Úsalas para:
Ajustar los objetos generados al terreno alcanzable
Restringir a los jugadores/NPCs a regiones transitables
Los colliders también se pueden usar para recortar mallas de navegación en el editor.
Componentes (resumen rápido)
Malla de navegación: la malla de navegación generada que consultas y reconstruyesNavmesh_Loop: bucles poligonales que definen los límites transitables (y los huecos)Colliders:
Box_Collider,Circle_Collider,Edge_Collider,Polygon_Collider
Referencia de la API de Navmesh
Navmesh :: class : Component {
// Proyecta un punto sobre esta malla de navegación.
// triangle_hint es una pista de aceleración que puedes reutilizar para consultas cercanas.
try_find_closest_point_on_navmesh :: method(
to_point: v2,
result: ref v2,
triangle_hint: ref s64
) -> bool;
// Lanza un rayo a través de la malla de navegación. Devuelve el punto final y si la consulta tuvo éxito.
try_raycast :: method(position: v2, direction: v2) -> (v2, bool);
// Poner en cola una reconstrucción para la actualización normal de la malla de navegación.
mark_for_rebuild :: method();
// Reconstruye ahora cuando una consulta en el mismo frame necesita la nueva geometría.
rebuild_immediately :: method() -> bool;
// Incluye solo los colliders de esta entidad y sus descendientes.
child_colliders_only: bool;
// Detecta cambios de entrada y reconstruye automáticamente.
enable_automatic_rebuilds: bool;
}Configuración en el editor (crear una malla de navegación)
Crea una entidad y añade un
Malla de navegacióncomponente.Crea entidades hijas con
Navmesh_Loopcomponentes para definir polígonos transitables.Para cada
Navmesh_Loop:Añade puntos para definir la forma del bucle
Ordena los puntos del contorno exterior en sentido antihorario
Para invertir un bucle existente, haz clic derecho en el
Navmesh_Loopencabezado del componente y selecciona Invertir el orden de giroAlternar Invertir interior/exterior para crear un agujero/obstáculo en lugar de espacio transitable
Usa las opciones de depuración de la malla de navegación en el inspector para visualizar los triángulos.
El orden de giro del bucle determina qué lado de cada arista se trata como el interior. El giro antihorario es el orden normal para un contorno exterior transitable. El giro horario invierte ese resultado. Si un bucle se creó al revés, haz clic derecho en el encabezado de su componente y selecciona Invertir el orden de giro. Usa Invertir interior/exterior deliberadamente para agujeros en lugar de depender de un orden de puntos invertido por accidente.
Colliders y bucles de malla de navegación
Los colliders también pueden aportar bucles mediante opciones del inspector del collider (por ejemplo "Make Navmesh Loop" / "Flip Navmesh Loop").
Advertencias importantes:
Con Habilitar reconstrucciones automáticas, las mallas de navegación detectan cambios en la entrada de bucles, colliders, tilemaps y mallas de navegación hijas y ponen en cola una reconstrucción.
Activa Solo colisionadores hijos para ignorar colisionadores no relacionados en otras partes de la escena.
Con las reconstrucciones automáticas desactivadas, llama a
mark_for_rebuild()después de cambiar una entrada.Llama a
rebuild_immediately()solo antes de una consulta en el mismo frame que requiera la geometría modificada.
Generación sobre la malla de navegación (ajustar al terreno alcanzable)
Usa try_find_closest_point_on_navmesh para proyectar una posición deseada sobre el punto válido más cercano de una malla de navegación:
Reconstrucción inmediata de mallas de navegación
La mayoría de los cambios de geometría se detectan automáticamente. Usa esto solo cuando necesites forzar el momento:
rebuild_immediately(): reconstruye ahora (úsalo solo si debes consultar la malla actualizada en el mismo frame)
Lanzamiento de rayos a través de una malla de navegación
try_raycast sigue la dirección hasta el límite de la malla de navegación. El segundo resultado indica si la consulta tuvo éxito.
Disparadores de colisionador
Un colisionador con is_trigger == true puede informar cuando otro colisionador entra, permanece dentro o sale. Los callbacks de disparador funcionan con colisionadores estáticos y en movimiento; no se requiere un Movement_Agent no se requiere una
Usa los colisionadores con moderación. Añádelos solo a superficies críticas para la jugabilidad: límites del mapa, plataformas sobre las que el jugador debe aterrizar, obstáculos clave y volúmenes de disparador deliberados. No añadas colisionadores a entidades decorativas (árboles, arbustos, props de fondo, etc.). La mayoría de las entidades en una escena no deberían tener colisionador.
Comprobaciones de proximidad y lógica de impacto personalizada
Para zonas de disparador que usan consultas de rango en lugar de callbacks de colisionador, objetos recogibles, comprobaciones de proyectiles u otra lógica personalizada de impacto, usa:
Scene.get_all_components_in_range/Scene.get_closest_component_in_rangeComprobaciones simples de distancia (
in_range) para decidir "dentro", "recogido", "impactado", etc.
Ayudantes de consulta de escena
Volumen de disparador (entrar / permanecer / salir)
Para simular una zona de disparador, mantén una lista de quién estaba dentro en el frame anterior y compárala con los resultados del frame actual.
Este patrón manual de disparador sigue siendo útil cuando no quieres añadir un volumen de disparador con colisionador. Si algo se teletransporta o desaparece entre actualizaciones, puede que no obtengas una "salida" limpia a menos que gestiones la limpieza.
Objetos recogibles (el más cercano en rango)
"Impactos" de movimiento rápido (submuestreo simple)
Si te mueves rápido (dash, proyectil), puedes pasar por alto objetivos estrechos cuando solo compruebas la posición final. Una solución sencilla es el submuestreo por pasos: toma unas cuantas muestras entre la posición anterior y la nueva y ejecuta las mismas consultas de rango.
Última actualización