Normally, a superb place to start out is the godot demos. There is a 3D Navigation demo with a personality shifting alongside ramps and a number of ranges. Nonetheless, solely the Godot 3.x model of that demo makes use of NavAgents (replace: The Godot 4 model now makes use of NavigationAgent3D
). However I feel you may translate that resolution to what you are doing. This is their code:
func _physics_process(delta):
if _nav_agent.is_navigation_finished():
return
var next_position = _nav_agent.get_next_location()
var offset = next_position - global_position
global_position = global_position.move_toward(next_position, delta * character_speed)
# Make the robotic take a look at the course we're touring.
# Clamp y to 0 so the robotic solely seems to be left and proper, not up/down.
offset.y = 0
look_at(global_position + offset, Vector3.UP)
If I C#-ifiy that code, it ought to look roughly like this:
NavigationAgent _nav_agent;
public override void _PhysicsProcess(double delta)
{
if (_nav_agent.IsNavigationFinished())
{
AnimationPlayer.Play("Idle");
return;
}
AnimationPlayer.Play("Stroll");
var next_position = _nav_agent.GetNextLocation();
var offset = next_position - GlobalPosition;
GlobalPosition = GlobalPosition.MoveToward(next_position, delta * character_speed);
// Make the robotic take a look at the course we're touring.
// Clamp y to 0 so the robotic solely seems to be left and proper, not up/down.
offset.y = 0;
look_at(GlobalPosition + offset, Vector3.UP);
}
Evaluating that to your code there are three core variations:
- Motion is finished by modifying the remodel
- Native vs international positions
- Look is finished after motion
Motion
I might recommend getting it to work with out MoveAndSlide
first to scale back the scope of your drawback. Get NavAgents working first, then begin determining physics.
Native vs International
The code in your query makes use of Place
and compares it to the worth returned by GetNextPathPosition
, however the docs say:
Vector3 get_next_path_position()
Returns the subsequent place in international coordinates that may be moved to…
In order that’s working with positions with two (probably) completely different frames of reference so the outcomes are meaningless. (If the participant is underneath the extent and the extent is at (100, 0, 0)
, then the values will all have x values off by 100. Use GlobalPosition
as an alternative.
LookAt
LookAt
is calculated based mostly in your present place (think about taking a look at an indication after which strolling previous it with out altering your head’s course), so that you wish to do it after you apply the transfer.
If that is not adequate to get your character feeling grounded, then it’s best to look into raycasts to snap them to the bottom or IK (Inverse Kinematics) to place their toes on the bottom.