Browse Source

Merge pull request #59438 from fabriceci/fix-move-and-collide-reported-collisions

Fix wrong collision reported on move_and_collide
Rémi Verschelde 3 years ago
parent
commit
212989d467
2 changed files with 10 additions and 2 deletions
  1. 5 1
      scene/2d/physics_body_2d.cpp
  2. 5 1
      scene/3d/physics_body_3d.cpp

+ 5 - 1
scene/2d/physics_body_2d.cpp

@@ -58,7 +58,11 @@ Ref<KinematicCollision2D> PhysicsBody2D::_move(const Vector2 &p_distance, bool p
 	PhysicsServer2D::MotionParameters parameters(get_global_transform(), p_distance, p_margin);
 
 	PhysicsServer2D::MotionResult result;
-	if (move_and_collide(parameters, result, p_test_only)) {
+
+	bool collided = move_and_collide(parameters, result, p_test_only);
+
+	// Don't report collision when the whole motion is done.
+	if (collided && result.collision_safe_fraction < 1) {
 		// Create a new instance when the cached reference is invalid or still in use in script.
 		if (motion_cache.is_null() || motion_cache->reference_get_count() > 1) {
 			motion_cache.instantiate();

+ 5 - 1
scene/3d/physics_body_3d.cpp

@@ -96,7 +96,11 @@ Ref<KinematicCollision3D> PhysicsBody3D::_move(const Vector3 &p_distance, bool p
 	parameters.max_collisions = p_max_collisions;
 
 	PhysicsServer3D::MotionResult result;
-	if (move_and_collide(parameters, result, p_test_only)) {
+
+	bool collided = move_and_collide(parameters, result, p_test_only);
+
+	// Don't report collision when the whole motion is done.
+	if (collided && result.collision_safe_fraction < 1) {
 		// Create a new instance when the cached reference is invalid or still in use in script.
 		if (motion_cache.is_null() || motion_cache->reference_get_count() > 1) {
 			motion_cache.instantiate();