Files
Blockline/scripts/arena_navigation.gd
T

33 lines
1.4 KiB
GDScript
Raw Normal View History

2026-09-12 11:01:37 +02:00
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)