summaryrefslogtreecommitdiff
path: root/scene/3d
diff options
context:
space:
mode:
authorPouleyKetchoupp <pouleyketchoup@gmail.com>2021-09-29 18:25:00 -0700
committerPouleyKetchoupp <pouleyketchoup@gmail.com>2021-09-29 18:30:57 -0700
commit6e6f292f154945654fcd752d5f9ee643d878cc59 (patch)
tree5eb901fa84d50f9d99bac9b5b3eeed658c26d1d7 /scene/3d
parentf72419d1525f2e5fe08f81a8fe06af3831c71c3e (diff)
Fix AnimatableBody moving and colliding during the first frame
_update_kinematic_motion() shouldn't be called in the constructor It's too early and causes a first call to set the body position to 0. Then the second call to set the actual position triggers kinematic motion, colliding with objects on the path to the initial position. Side effect of sync to physics now enabled by default.
Diffstat (limited to 'scene/3d')
-rw-r--r--scene/3d/physics_body_3d.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/scene/3d/physics_body_3d.cpp b/scene/3d/physics_body_3d.cpp
index f4b431598a..5a12def3f8 100644
--- a/scene/3d/physics_body_3d.cpp
+++ b/scene/3d/physics_body_3d.cpp
@@ -340,6 +340,12 @@ void AnimatableBody3D::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
last_valid_transform = get_global_transform();
+ _update_kinematic_motion();
+ } break;
+
+ case NOTIFICATION_EXIT_TREE: {
+ set_only_update_transform_changes(false);
+ set_notify_local_transform(false);
} break;
case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: {
@@ -367,8 +373,6 @@ void AnimatableBody3D::_bind_methods() {
AnimatableBody3D::AnimatableBody3D() :
StaticBody3D(PhysicsServer3D::BODY_MODE_KINEMATIC) {
PhysicsServer3D::get_singleton()->body_set_state_sync_callback(get_rid(), this, _body_state_changed_callback);
-
- _update_kinematic_motion();
}
void RigidDynamicBody3D::_body_enter_tree(ObjectID p_id) {