72 lines
2 KiB
GDScript3
72 lines
2 KiB
GDScript3
|
extends Node2D
|
||
|
|
||
|
const movement_speed = 100
|
||
|
|
||
|
var single = NavigationPolygon.new()
|
||
|
var double = NavigationPolygon.new()
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
func _ready():
|
||
|
single.agent_radius = 0.75
|
||
|
double.agent_radius = 1.5
|
||
|
var root_node: Node3D = get_node("NavigationMeshBakingRootNode")
|
||
|
|
||
|
NavigationServer2D.parse_source_geometry_data(single, $nav.navigation_polygon, root_node)
|
||
|
|
||
|
for s in [single, double]:
|
||
|
NavigationServer2D.bake_from_source_geometry_data(single, $nav.navigation_polygon)
|
||
|
NavigationServer2D.bake_from_source_geometry_data(double, $nav.navigation_polygon)
|
||
|
|
||
|
var single_map: RID = NavigationServer2D.map_create()
|
||
|
var double_map: RID = NavigationServer2D.map_create()
|
||
|
|
||
|
NavigationServer2D.map_set_active(single_map, true)
|
||
|
NavigationServer2D.map_set_active(double_map, true)
|
||
|
|
||
|
var single_reg: RID = NavigationServer2D.region_create()
|
||
|
var double_reg: RID = NavigationServer2D.region_create()
|
||
|
|
||
|
NavigationServer2D.region_set_map(single_reg, single_map)
|
||
|
NavigationServer2D.region_set_map(double_reg, double_map)
|
||
|
|
||
|
NavigationServer3D.region_set_navigation_mesh(single_reg, single)
|
||
|
NavigationServer3D.region_set_navigation_mesh(double_reg, double)
|
||
|
|
||
|
$small/nav.path_desired_distance = 4.0
|
||
|
$small/nav.target_desired_distance = 4.0
|
||
|
$large/nav.path_desired_distance = 4.0
|
||
|
$large/nav.target_desired_distance = 4.0
|
||
|
|
||
|
call_deferred("actor_setup")
|
||
|
|
||
|
func actor_setup():
|
||
|
print("actor_setup awaiting...")
|
||
|
await get_tree().physics_frame
|
||
|
print("actor_setup finished awaiting")
|
||
|
set_movement_target($target.position)
|
||
|
|
||
|
func set_movement_target(p):
|
||
|
print("target: ", p)
|
||
|
$small/nav.target_position = p
|
||
|
$large/nav.target_position = p
|
||
|
|
||
|
func _process(delta):
|
||
|
pass
|
||
|
|
||
|
func do_path(a: CharacterBody2D, map: NavigationPolygon):
|
||
|
var n = a.get_node("nav")
|
||
|
if n.is_navigation_finished():
|
||
|
return
|
||
|
var p: Vector2 = a.global_position
|
||
|
var path = NavigationServer2D.map_get_path(map, p, $target.global_position, true)
|
||
|
print(path)
|
||
|
a.velocity = p.direction_to(path[0]) * movement_speed
|
||
|
a.move_and_slide()
|
||
|
print(path[0])
|
||
|
|
||
|
func _physics_process(delta):
|
||
|
do_path($small, single)
|
||
|
do_path($large, double)
|