お世話になっております。
再現手順の方に詳細など諸々記載させていただきましたが
SimulatePhysicsがOFFの状態のVehicleが接地しているコリジョンを削除した場合にクラッシュが発生する様でした。
調査したところ、
FPBDSuspensionConstraintsクラスが保持しているGroundParticlesで
削除された地面のParticleのポインタを無効なまま保持し続けておりそのポインタを他の処理で使おうとしてクラッシュなどの問題に至っている様でした。
こちらの問題に関して試しに
FPBDSuspensionConstraintsクラスのDisconnectConstraints関数に
GroundParticlesのチェック処理しnullptrをセットする様にしたところ
一応今回報告させていただいているクラッシュ自体は回避できていそうではあったのですが
こちらの修正が適切かご確認いただけませんでしょうか?
そもそも不具合の根本的問題の認識が違う場合や
他に最善の対応方法などありましたらご指摘いただけると幸いです。
*試しに変更した処理に関しては下記に記載した追加コード部分になります
Engine\Source\Runtime\Experimental\Chaos\Private\Chaos\PBDSuspensionConstraints.cpp
void FPBDSuspensionConstraints::DisconnectConstraints(const TSet<TGeometryParticleHandle<FReal, 3>*>& RemovedParticles)
{
for (FGeometryParticleHandle* RemovedParticle : RemovedParticles)
{
for (FConstraintHandle* ConstraintHandle : RemovedParticle->ParticleConstraints())
{
if (FPBDSuspensionConstraintHandle* SuspensionHandle = ConstraintHandle->As<FPBDSuspensionConstraintHandle>())
{
SuspensionHandle->SetEnabled(false); // constraint lifespan is managed by the proxy
int ConstraintIndex = SuspensionHandle->GetConstraintIndex();
if (ConstraintIndex != INDEX_NONE)
{
if (ConstrainedParticles[ConstraintIndex] == RemovedParticle)
{
ConstrainedParticles[ConstraintIndex] = nullptr;
GroundParticles[ConstraintIndex] = nullptr;
}
}
}
}
// [追加コード 開始] GroundParticlesのチェックを追加
for (int32 ConstraintIndex = 0; ConstraintIndex < GroundParticles.Num(); ++ConstraintIndex)
{
if (GroundParticles[ConstraintIndex] == RemovedParticle)
{
GroundParticles[ConstraintIndex] = nullptr;
}
}
// [追加コード 終了] GroundParticlesのチェックを追加
}
}
[Attachment Removed]