Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NavigationAgents' is_target_reached returns false even within target_desired_distance to the target_position #82560

Closed
ershn opened this issue Sep 30, 2023 · 0 comments · Fixed by #82561

Comments

@ershn
Copy link
Contributor

ershn commented Sep 30, 2023

Godot version

v4.1.1.stable.mono.official [bd6af8e]

System information

Godot v4.1.1.stable.mono - Windows 10.0.19045 - Vulkan (Forward+) - dedicated Radeon RX 580 Series (Advanced Micro Devices, Inc.; 31.0.21902.5) - AMD Ryzen 7 2700X Eight-Core Processor (16 Threads)

Issue description

Problem

When using a NavigationAgent2D/3D, if target_desired_distance is below path_desired_distance (which is the default for NavigationAgent2D), is_target_reached will not become true even if you are within target_desired_distance distance to the target_position.

The documentation says nothing about that behavior.

If target_desired_distance is equal or above path_desired_distance, the problem won't appear.

Expected behavior

If the position of the parent node of a NavigationAgent2D/3D is within target_desired_distance to target_position, is_target_reached invariably returns true.

Code sample

extends CharacterBody2D

var movement_speed: float = 200.0

@export var target_node: Node2D
@onready var navigation_agent: NavigationAgent2D = $NavigationAgent2D

func _ready():
	navigation_agent.path_desired_distance = 20
	navigation_agent.target_desired_distance = 10
	call_deferred("actor_setup")

func actor_setup():
	await get_tree().physics_frame
	navigation_agent.target_position = target_node.global_position

func _physics_process(delta):
	var next_path_position = navigation_agent.get_next_path_position()
	
	var new_velocity = next_path_position - global_position
	velocity = new_velocity.normalized() * movement_speed

	move_and_slide()
	
	if navigation_agent.is_target_reached():
		print("Target reached") # this will never be printed

Cause of the bug

I looked at the source code and the reason for this behavior is that once the last path waypoint has been reached, the distance check that changes is_target_reached to true won't run anymore.
It's an easy fix and I have a PR ready that I'll publish just after this bug report.

Steps to reproduce

  1. Open the MRP
  2. Run the 2D or 3D scene
  3. Observe the property values of the navigation agent that are printed to the output

Minimal reproduction project

Bug reproduction.zip

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants