From 76c6c8d038bf629a9d7b1f8abd4a7380f7065963 Mon Sep 17 00:00:00 2001 From: luchu1993 Date: Sat, 12 Sep 2026 22:57:55 +0800 Subject: [PATCH] Fix mesh collider updates after recooking collision data --- .../Engine/Physics/Colliders/MeshCollider.cpp | 19 +++++++++++++++---- .../Engine/Physics/Colliders/MeshCollider.h | 2 ++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Source/Engine/Physics/Colliders/MeshCollider.cpp b/Source/Engine/Physics/Colliders/MeshCollider.cpp index 91731e7de..5e7343a8a 100644 --- a/Source/Engine/Physics/Colliders/MeshCollider.cpp +++ b/Source/Engine/Physics/Colliders/MeshCollider.cpp @@ -3,6 +3,7 @@ #include "MeshCollider.h" #include "Engine/Core/Math/Matrix.h" #include "Engine/Core/Math/Ray.h" +#include "Engine/Core/ScopeExit.h" #include "Engine/Physics/Physics.h" #include "Engine/Physics/PhysicsScene.h" #if USE_EDITOR || !BUILD_RELEASE @@ -22,19 +23,29 @@ void MeshCollider::OnCollisionDataChanged() if (CollisionData) { + _isChangingCollisionData = true; + SCOPE_EXIT { _isChangingCollisionData = false; }; + // Ensure that collision asset is loaded (otherwise objects might fall though collider that is not yet loaded on play begin) - CollisionData->WaitForLoaded(); + // OnSet sends Loaded after Changed returns, so let that notification update the collider once. + if (!CollisionData->WaitForLoaded()) + return; } + // Clearing the reference or failing to load won't send Loaded, so clear the old geometry here. UpdateGeometry(); UpdateBounds(); } void MeshCollider::OnCollisionDataLoaded() { - // Not needed as OnCollisionDataChanged waits for it to be loaded - //UpdateGeometry(); - //UpdateBounds(); + // WaitForLoaded can dispatch Loaded while Changed is still waiting. OnSet will send it again afterwards. + if (_isChangingCollisionData) + return; + + // Virtual collision data can be recooked without changing the asset reference. + UpdateGeometry(); + UpdateBounds(); } bool MeshCollider::CanAttach(RigidBody* rigidBody) const diff --git a/Source/Engine/Physics/Colliders/MeshCollider.h b/Source/Engine/Physics/Colliders/MeshCollider.h index 2e1ce533a..bc04575b0 100644 --- a/Source/Engine/Physics/Colliders/MeshCollider.h +++ b/Source/Engine/Physics/Colliders/MeshCollider.h @@ -23,6 +23,8 @@ public: AssetReference CollisionData; private: + bool _isChangingCollisionData = false; + void OnCollisionDataChanged(); void OnCollisionDataLoaded();