godot-demo-projects/3d/navigation/character.gd

45 lines
1.3 KiB
GDScript

extends Marker3D
@export var character_speed := 10.0
@export var show_path := true
var _nav_path_line: Line3D
@onready var _nav_agent := $NavigationAgent3D as NavigationAgent3D
func _ready() -> void:
_nav_path_line = Line3D.new()
add_child(_nav_path_line)
_nav_path_line.set_as_top_level(true)
func _physics_process(delta: float) -> void:
if _nav_agent.is_navigation_finished():
return
var next_position := _nav_agent.get_next_path_position()
var offset := next_position - global_position
global_position = global_position.move_toward(next_position, delta * character_speed)
# Make the robot look at the direction we're traveling.
# Clamp Y to 0 so the robot only looks left and right, not up/down.
offset.y = 0
if not offset.is_zero_approx():
look_at(global_position + offset, Vector3.UP)
func set_target_position(target_position: Vector3) -> void:
_nav_agent.set_target_position(target_position)
# Get a full navigation path with the NavigationServer API.
if show_path:
var start_position := global_transform.origin
var optimize := true
var navigation_map := get_world_3d().get_navigation_map()
var path := NavigationServer3D.map_get_path(
navigation_map,
start_position,
target_position,
optimize
)
_nav_path_line.draw_path(path)