SimulatePhysicsがOFFの状態のVehicleが接地しているコリジョンを削除するとクラッシュする

お世話になっております。

再現手順の方に詳細など諸々記載させていただきましたが

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]

再現手順
問題のクラッシュを再現できるようにエンジンVer5.8.2,C++,Vehicleテンプレートをベースに再現プロジェクトを作成致しました。

添付したプロジェクトを起動していただくとNewMapという簡易的なマップが開かれた状態になるかと思います。

マップを開いて1秒後以降の適当なタイミングでキーボードの9キーを入力していただくとクラッシュ(再現プロジェクトではRangeCheck関数でストップ)が発生いたします。

*こちらで試した限りでは必ず発生

タイトルに記載した様に

SimulatePhysicsがOFFの状態のVehicleが接地しているコリジョンが削除された場合にクラッシュするため

こちらの再現プロジェクトでは下記の様な対応を入れています。

*プロジェクト説明

レベルにBP_OffroadCar_Pawn(Vehicle)とSM_Track_10M(地面)を配置しており

BP_OffroadCar_PawnはSM_Track_10Mに接地するようになっています。

BP_OffroadCar_Pawnに関しては生成されて1秒経過したらSimulatePhysicsをOFFにしていて

9キーを入力することでSM_Track_10M(地面)をDestroyActorで削除するようにしており

その結果クラッシュするようになっています。

一応記載ぐらいですが地面の削除に関してはワールドパーティションでアンロード状態になった場合でも同様の問題が発生する様でした。

[Attachment Removed]

再現プロジェクトのご用意ありがとうございました。問題を再現することができました。

本件を UE-394517 Crash when a floor mesh is removed while a Vehicle has SimulatePhysics disabled としてバグ登録させていただきました。数営業日後にIssuesに公開予定です。

さてワークアラウンドの件ですがご提案いただいた修正は適切だと考えられ、通常動作している車両にも副作用が見られず特に問題は見当たりません。

[Attachment Removed]

ご確認いただきありがとうございました。

今回提案させていただいた方法で特に問題なさそうなのでこちらの方法で対応を進めようと思います。

[Attachment Removed]