33 lines
1.4 KiB
GDScript
33 lines
1.4 KiB
GDScript
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)
|