サブステップ間にVehicleと衝突した対象のPhysicalMaterialを取得したい

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

サブステップ間にVehicleと衝突した対象のPhysicalMaterialを取得する方法について、

void FChaosVehicleManagerAsyncCallback::OnContactModification_Internal(Chaos::FCollisionContactModifier& Modifier) { const FChaosVehicleManagerAsyncInput* Input = GetConsumerInput_Internal(); const TArray<TUniquePtr<FChaosVehicleAsyncInput>>& InputVehiclesBatch = Input->VehicleInputs; //なんらかの方法で操作対象を取得する for( auto& Vehicle : InputVehiclesBatch) { Chaos::FSingleParticlePhysicsProxy* PhysicsProxy = Vehicle->Proxy; Chaos::FGeometryParticleHandle* Handle = reinterpret_cast<Chaos::FGeometryParticleHandle*>(PhysicsProxy->GetHandle_LowLevel()); Chaos::FContactPairModifierParticleRange Range = Modifier.GetContacts(Handle); //対象のParticleProxyに関連したコンタクトペアリストを取得 for (Chaos::FContactPairModifier PairModifier : Range ) { int32 OtherIndex = PairModifier.GetParticlePair()[0] != Handle ? 0 : 1; if(Chaos::FGeometryParticleHandle* OtherHandle = PairModifier.GetParticlePair()[OtherIndex]) { if(IPhysicsProxyBase* Proxy = OtherHandle->PhysicsProxy()) { if(const Chaos::FPhysicsSolver* PhysicsSolver = Proxy->GetSolver<Chaos::FPhysicsSolver>()) { if(const FPhysScene* PhysScene = static_cast<FPhysScene*>(PhysicsSolver->PhysSceneHack)) { if(UPrimitiveComponent* ContactComp = PhysScene->GetOwningComponent<UPrimitiveComponent>(Proxy)) { if(FBodyInstance* BodyInstance = ContactComp->GetBodyInstance()) { //衝突対象のPhysicalMaterialを取得 UPhysicalMaterial* PhysicalMaterial = BodyInstance->GetSimplePhysicalMaterial(); } } } } } } } } }<br/>

こちらの方法で対応できることを確認しております。

ただ、下記URLにある通り、UObjectへのアクセスは安全ではないという記載があるため、

別途対応方法について検討しているのですが、何か別の方法でPhysicalMaterialを取得する方法はありますでしょうか?

[Content removed]

<br/>

Substep間の情報を取得するような場合SimCallbackを利用することは標準的な方法になると思います。

安全にデータにアクセスするには、コールバックで得られたPhysicsProxy(IPhysicsProxyBase)と必要な情報を安全なコンテナに保存し、その後GameThread上で実行される更新処理の中でコンテナを解釈してPhysScene->GetOwningComponentを通じてUObject継承クラスにアクセスする方法です。

エンジン内を​GetOwningComponentで検索すると同じような構造を持った関数をいくつか見つけることができると思います。

(UBuoyancySubsystem::ProcessSurfaceTouchCallbacksやUChaosGameplayEventDispatcher::HandleCollisionEventsなど)

返信遅くなり申し訳ありません。

ご返答頂きありがとうございます。​

>安全にデータにアクセスするには、コールバックで得られたPhysicsProxy(IPhysicsProxyBase)と必要な情報を安全なコンテナに保存し、その後GameThread上で実行される更新処理の中でコンテナを解釈してPhysScene->GetOwningComponentを通じてUObject継承クラスにアクセスする方法です。

できれば、PhysicsThreadで呼び出される​void FChaosVehicleManagerAsyncCallback::OnContactModification_Internal内でPhysicalMaterialにアクセスしたいと考えているのですが、PhysicsThreadでPhysicalMaterialに安全にアクセスする方法は全くないということなんでしょうか?

> PhysicsThreadでPhysicalMaterialに安全にアクセスする方法は全くないということなんでしょうか?

物理スレッドから参照されるプロパティに対して並列して動作する他スレッドが干渉しないことをタイトル側で保証し、UObject継承変数にアクセスする際にIsValidで検証を行えば安全にアクセスすることは可能です。

返信遅くなり申し訳ありません。

ご返答頂きありがとうございます。

>物理スレッドから参照されるプロパティに対して並列して動作する他スレッドが干渉しないことをタイトル側で保証し、UObject継承変数にアクセスする際にIsValidで検証を行えば安全にアクセスすることは可能です。

承知いたしました。そちらの対応方法で可能か検討してみようと思います。

調査いただきありがとうございました。