diff options
author | fabriceci <fabricecipolla@gmail.com> | 2021-11-23 11:29:29 +0100 |
---|---|---|
committer | fabriceci <fabricecipolla@gmail.com> | 2021-11-23 11:29:29 +0100 |
commit | ed9b18be94b1786b23d8e302621502d61d8f48b5 (patch) | |
tree | fbd76f5000d02a01170ff97565900be0f1f1b514 | |
parent | dbef4bbd98b655d6f89601c9e44c679b373b3628 (diff) |
Fix horizontal velocity being always reset when the body hit a wall in 3d
-rw-r--r-- | scene/3d/physics_body_3d.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/scene/3d/physics_body_3d.cpp b/scene/3d/physics_body_3d.cpp index edaf76bc3e..393e29e398 100644 --- a/scene/3d/physics_body_3d.cpp +++ b/scene/3d/physics_body_3d.cpp @@ -1328,8 +1328,15 @@ void CharacterBody3D::_move_and_slide_grounded(double p_delta, bool p_was_on_flo // Apply slide on forward in order to allow only lateral motion on next step. Vector3 forward = wall_normal.slide(up_direction).normalized(); motion = motion.slide(forward); - // Avoid accelerating when you jump on the wall and smooth falling. - motion_velocity = motion_velocity.slide(forward); + + // Scales the horizontal velocity according to the wall slope. + if (vel_dir_facing_up) { + Vector3 slide_motion = motion_velocity.slide(result.collisions[0].normal); + // Keeps the vertical motion from motion_velocity and add the horizontal motion of the projection. + motion_velocity = up_direction * up_direction.dot(motion_velocity) + slide_motion.slide(up_direction); + } else { + motion_velocity = motion_velocity.slide(forward); + } // Allow only lateral motion along previous floor when already on floor. // Fixes slowing down when moving in diagonal against an inclined wall. |