class_name ArenaNavigation extends Node var map_rid := RID() var region_rid := RID() var mesh: NavigationMesh func setup(resource_path: String) -> void: mesh = load(resource_path) as NavigationMesh map_rid = NavigationServer3D.map_create() NavigationServer3D.map_set_use_async_iterations(map_rid, false) NavigationServer3D.map_set_cell_size(map_rid, 0.01) NavigationServer3D.map_set_cell_height(map_rid, 0.01) NavigationServer3D.map_set_active(map_rid, true) region_rid = NavigationServer3D.region_create() NavigationServer3D.region_set_use_async_iterations(region_rid, false) NavigationServer3D.region_set_use_edge_connections(region_rid, false) NavigationServer3D.region_set_navigation_mesh(region_rid, mesh) NavigationServer3D.region_set_map(region_rid, map_rid) NavigationServer3D.map_force_update(map_rid) func nearest(point: Vector3) -> Vector3: if NavigationServer3D.map_get_iteration_id(map_rid) == 0: return point return NavigationServer3D.map_get_closest_point(map_rid, point) func path(from: Vector3, to: Vector3) -> PackedVector3Array: if NavigationServer3D.map_get_iteration_id(map_rid) == 0: return PackedVector3Array() return NavigationServer3D.map_get_path(map_rid, nearest(from), nearest(to), true) func _exit_tree() -> void: if region_rid.is_valid(): NavigationServer3D.free_rid(region_rid) if map_rid.is_valid(): NavigationServer3D.free_rid(map_rid)