routeNavmesh y colisión

Las navmeshes definen el espacio transitable para la búsqueda de rutas y las restricciones de movimiento.

Las navmeshes definen las áreas transitables en tu mundo. Úsalas para:

  • Ajustar los objetos generados sobre el terreno alcanzable

  • Restringir a los jugadores/NPCs a regiones transitables

Los colliders también se pueden usar para recortar navmeshes en el editor.

Componentes (resumen rápido)

  • Navmesh: la malla de navegación cocinada que consultas y reconstruyes

  • Navmesh_Loop: bucles de polígonos que definen límites transitables (y agujeros)

  • Colliders: Box_Collider, Circle_Collider, Edge_Collider, Polygon_Collider

circle-info

Para movimiento/búsqueda de ruta (Movement_Agent) consulta Agentes de movimiento/PNJ.

Referencia de la API de Navmesh

Navmesh :: class : Component {
    // Proyecta un punto sobre esta navmesh.
    // 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;

    rebuild_immediately :: method() -> bool;
    mark_for_rebuild    :: method();
}

Configuración del editor (construir una navmesh)

  1. Crea una entidad y añade un Navmesh componente.

  2. Crea entidades hijas con Navmesh_Loop componentes para definir polígonos transitables.

  3. Para cada Navmesh_Loop:

    • Añade puntos para definir la forma del bucle

    • Activa Invertir interior/exterior para convertirlo en un agujero/obstáculo en lugar de espacio transitable

  4. Usa las opciones de depuración de la navmesh en el inspector para visualizar los triángulos.

circle-info

Por defecto, un Navmesh_Loop define un área transitable. Invértelo para "abrir agujeros" (islas no transitables) en una navmesh existente.

Colliders y bucles de navmesh

Los colliders también pueden aportar bucles mediante opciones del inspector del collider (por ejemplo, "Make Navmesh Loop" / "Flip Navmesh Loop").

Advertencias importantes:

  • Un Navmesh no no se reconstruye automáticamente solo porque un collider cambie en tiempo de ejecución.

  • Si modificas la geometría del collider y dependes de bucles impulsados por colliders, reconstruye manualmente la navmesh (ver más abajo).

  • Si quieres una navmesh que ignore por completo los colliders, usa la opción del inspector de la navmesh para ignorar colliders.

Generación sobre la navmesh (ajustar al terreno alcanzable)

Usa try_find_closest_point_on_navmesh para proyectar una posición deseada al punto válido más cercano en una navmesh:

circle-info

Reutiliza triangle_hint para consultas repetidas en la misma zona (generadores de botín, apariciones por oleadas, etc.). Puede acelerar significativamente la proyección.

Reconstrucción de navmeshes (cuando cambia la geometría)

Usa una de estas opciones:

  • mark_for_rebuild(): pospone la reconstrucción al inicio del siguiente frame (mejor para agrupar cambios)

  • rebuild_immediately(): reconstruye ahora (úsalo solo si debes consultar la malla actualizada en el mismo frame)

circle-exclamation

Colisión (soporte actual de CSL)

Los colliders existen como componentes (Box_Collider, Circle_Collider, Edge_Collider, Polygon_Collider), pero los callbacks de scripting de entrada/salida de colisión aún no están implementados en CSL.

Comportamiento de colisión pseudonatural (triggers, objetos recogibles, "golpes")

Hasta que los callbacks de colisión estén expuestos en CSL, el enfoque estándar es:

  • Consultar componentes cercanos con Scene.get_all_components_in_range / Scene.get_closest_component_in_range

  • Hacer comprobaciones simples de distancia (in_range) para decidir "dentro", "recogido", "golpeado", etc.

Ayudantes de consulta de escena

circle-info

Prefiere el lado del servidor para las consecuencias jugables (daño, recogidas, puntuación). Usa comprobaciones solo locales para retroalimentación visual.

Volumen de activación (entrar / permanecer / salir)

Para simular una zona de activación, mantén una lista de quién estaba dentro el último frame y compárala con los resultados del frame actual.

circle-exclamation

Recogibles (el más cercano en rango)

Golpes de movimiento rápido (subpasos simples)

Si te mueves muy rápido (dash, proyectil), puedes pasar por alto objetivos estrechos cuando solo compruebas la posición final. Una solución sencilla es usar subpasos: muestrear unos pocos puntos entre la posición anterior y la nueva y ejecutar las mismas consultas de rango.

Última actualización