From 1eaf40f2f7f2397cf6b15c83b406ff8594decefa Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 5 Jun 2025 12:40:47 +0200 Subject: [PATCH] Fix changing CharacterController center at runtime to maintain actor placement --- .../Physics/Colliders/CharacterController.cpp | 15 +++++++++++++++ Source/Engine/Physics/Colliders/Collider.h | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Source/Engine/Physics/Colliders/CharacterController.cpp b/Source/Engine/Physics/Colliders/CharacterController.cpp index 57e0a92a2..ce899d076 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.cpp +++ b/Source/Engine/Physics/Colliders/CharacterController.cpp @@ -292,6 +292,21 @@ RigidBody* CharacterController::GetAttachedRigidBody() const return nullptr; } +void CharacterController::SetCenter(const Vector3& value) +{ + if (value == _center) + return; + Vector3 delta = value - _center; + _center = value; + if (_controller) + { + // Change physics position while maintaining actor placement + Vector3 position = PhysicsBackend::GetControllerPosition(_controller); + position += _upDirection * delta; + PhysicsBackend::SetControllerPosition(_controller, position); + } +} + void CharacterController::OnActiveTransformChanged() { if (!_shape) diff --git a/Source/Engine/Physics/Colliders/Collider.h b/Source/Engine/Physics/Colliders/Collider.h index 3156f0ce8..7d354200f 100644 --- a/Source/Engine/Physics/Colliders/Collider.h +++ b/Source/Engine/Physics/Colliders/Collider.h @@ -61,7 +61,7 @@ public: /// /// Sets the center of the collider, measured in the object's local space. /// - API_PROPERTY() void SetCenter(const Vector3& value); + API_PROPERTY() virtual void SetCenter(const Vector3& value); /// /// Gets the contact offset. Colliders whose distance is less than the sum of their ContactOffset values will generate contacts. The contact offset must be positive. Contact offset allows the collision detection system to predictively enforce the contact constraint even when the objects are slightly separated.