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:refv2,triangle_hint:refs64)->bool;rebuild_immediately::method()->bool;mark_for_rebuild::method();}
Configuración del editor (construir una navmesh)
Crea una entidad y añade un Navmesh componente.
Crea entidades hijas con Navmesh_Loop componentes para definir polígonos transitables.
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
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. 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:
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)
Si tienes una navmesh padre que "cose" varias navmeshes hijas, cambiar una navmesh hija no reconstruye automáticamente la padre. Llama a mark_for_rebuild() / rebuild_immediately() en la padre después de editar.
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
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.
Esto es lógica de colisión de "mejor esfuerzo". Si algo se teletransporta o desaparece entre actualizaciones, puede que no obtengas una "salida" limpia a menos que gestiones la limpieza.
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.