Navmesh::clase: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::método(to_point:v2,result:refv2,triangle_hint:refs64)->bool;rebuild_immediately::método()->bool;mark_for_rebuild::método();}
Configuración del editor (construyendo una navmesh)
Crea una entidad y añade un Navmesh componente.
Crea entidades hijo con Navmesh_Loop componentes para definir polígonos transitables.
Para cada Navmesh_Loop:
Añade puntos para definir la forma del bucle
Alternar Invertir interior exterior para convertirlo en un hueco/obstáculo en lugar de espacio transitable
Usa las opciones de depuración de la navmesh en el inspector para visualizar los triángulos.
Por defecto, un Navmesh_Loop define un área transitable. Inviértelo para "hacer agujeros" (islas intransitables) en una navmesh existente.
Colliders y bucles de navmesh
Los colliders también pueden aportar bucles mediante las opciones del inspector de collider (por ejemplo "Hacer Navmesh Loop" / "Invertir Navmesh Loop").
Advertencias importantes:
Un Navmesh no hace reconstrucción 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 la navmesh manualmente (ver más abajo).
Si quieres una navmesh que ignore completamente los colliders, usa la opción del inspector de navmesh para ignorar colliders.
Generar sobre la navmesh (ajustar al suelo alcanzable)
Usa try_find_closest_point_on_navmesh para proyectar una posición deseada sobre el punto válido más cercano en una navmesh:
Reutiliza triangle_hint para consultas repetidas en la misma área (generadores de botín, generación por oleadas, etc.). Puede acelerar significativamente la proyección.
Reconstrucción de navmeshes (cuando la geometría cambia)
Usa una de:
mark_for_rebuild(): difiere la reconstrucción al inicio del siguiente frame (mejor para agrupar)
rebuild_immediately(): reconstruye ahora (usar solo si debes consultar la malla actualizada en el mismo frame)
Si tienes una navmesh padre que "coser" varias navmeshes hijas, cambiar una navmesh hija no reconstruye automáticamente la padre. Llama mark_for_rebuild() / rebuild_immediately() en la padre después de las ediciones.
Colisión (soporte actual de CSL)
Los colliders existen como componentes (Box_Collider, Circle_Collider, Edge_Collider, Polygon_Collider), pero las callbacks de scripting de entrada/salida de colisión están aún no implementadas en CSL.
Comportamiento de colisión pseudo (triggers, pickups, "golpes")
Hasta que las callbacks de colisión se expongan en CSL, el enfoque estándar es:
Consultar componentes cercanos con Scene.get_all_components_in_range / Scene.get_closest_component_in_range
Realizar comprobaciones simples de distancia (in_range) para decidir "dentro", "recogido", "golpeado", etc.
Ayudantes de consulta de Scene
Prefiere el lado del servidor para consecuencias de jugabilidad (daño, recogidas, puntuación). Usa comprobaciones locales solo para retroalimentación cosmética.
Volumen trigger (entrada / permanencia / salida)
Para simular una zona trigger, mantiene una lista de quién estaba dentro en el frame anterior y compárala con los resultados del frame actual.
Esta es una lógica de colisión de "mejor esfuerzo". Si algo es teletransportado/desaparecido entre actualizaciones, puede que no obtengas una "salida" limpia a menos que manejes la limpieza.
Recogibles (el más cercano en rango)
"Golpes" por movimiento rápido (subpasos simples)
Si te mueves rápidamente (embestida, proyectil), puedes fallar objetivos estrechos si solo compruebas la posición final. Una solución simple es subpasos: muestrea algunos puntos entre la posición anterior y la nueva y ejecuta las mismas consultas de rango.