content

I'm trying to debug why avoidance doesn't seem to work with Godot's 2D navigation tutorial example code.

I've updated the example code to use set_velocity(). This required changes in two places. First, in _ready, I need to hook up the velocity_computed callback:

func _ready():
	# This hooks up the computed velocity when avoidance is being used.
	navigation_agent.velocity_computed.connect(update_movement)

	# Omitted...

Then, in _physics_process, I need to call NavigationAgent2D's set_velocity instead of move_and_slide so that it can be used in the collision avoidance algorithm.

func _physics_process(delta):
	if navigation_agent.is_navigation_finished():
		return

	var current_agent_position: Vector2 = global_position
	var next_path_position: Vector2 = navigation_agent.get_next_path_position()

	var new_velocity: Vector2 = next_path_position - current_agent_position
	new_velocity = new_velocity.normalized()
	new_velocity = new_velocity * movement_speed

	# Tell the navigation agent about the desired velocity
	navigation_agent.set_velocity(new_velocity)

func update_movement(new_velocity: Vector2) -> void:
	velocity = new_velocity
	move_and_slide()

After the collision avoidance has been computed, the new velocity is sent to update_movement via the velocity_computed signal that was set up earlier at the end of _physics_processand we can move correctly using the new velocity.

Important things I noticed:

  • The max_speed property will clamp the magnitude of the velocity passed to set_velocity to the max_speed value.

meta

created:

backlinks: My NavigationAgent2D is not avoiding other agents

commit: 74cb7704