お世話になっております。
4.20環境にてコンポーネントA(PrimitiveComponent)をコンポーネントB(PrimitiveComponent)にAttachToComponentしたあと状況に応じて
コンポーネントAのPMをUPrimitiveComponent::SetPhysMaterialOverrideにて変更していましたが、4.21環境では変更が反映されないようになりました。
調べたところAttachToComponentされた段階でコンポーネントAのBodyInstanceのActorHandleがReleaseされているため、
BodyInstanceのUpdatePhysicalMaterialsが実行されないようです。
4.21環境ではAttachToComponentした場合はUPrimitiveComponent::SetPhysMaterialOverrideが反映されない仕様なのでしょうか?
/****************************4.21環境******************************************/
void FBodyInstance::UpdatePhysicalMaterials()
{
SCOPE_CYCLE_COUNTER(STAT_UpdatePhysMats);
UPhysicalMaterial* SimplePhysMat = GetSimplePhysicalMaterial();
TArray ComplexPhysMats = GetComplexPhysicalMaterials();
//↓ActorHandle.IsValid()==falseだとFPhysicsCommand::ExecuteWriteが実行されない。(AttachToComponentでActorHandleがReleaseされている。)
FPhysicsCommand::ExecuteWrite(ActorHandle, [&](const FPhysicsActorHandle& Actor)
{
ApplyMaterialToInstanceShapes_AssumesLocked(SimplePhysMat, ComplexPhysMats);
});
}
/****************************4.20環境******************************************/
void FBodyInstance::UpdatePhysicalMaterials()
{
SCOPE_CYCLE_COUNTER(STAT_UpdatePhysMats);
UPhysicalMaterial* SimplePhysMat = GetSimplePhysicalMaterial();
TArray ComplexPhysMats = GetComplexPhysicalMaterials();
#if WITH_PHYSX
PxMaterial* PSimpleMat = SimplePhysMat ? SimplePhysMat->GetPhysXMaterial() : nullptr;
//↓4.20環境ではActorHandleは見ていない。(そもそもActorHandleがない)
ExecuteOnPhysicsReadWrite([&]()
{
ApplyMaterialToInstanceShapes_AssumesLocked(PSimpleMat, ComplexPhysMats);
});
#endif
}
お世話になっております。
UE4.21環境で再現を試みているのですが、未だ同様の現象を確認できてなく FBodyInstance::UpdatePhysicalMaterials
における FPhysicsCommand::ExecuteWrite
, ApplyMaterialToInstanceShapes_AssumesLocked
共に処理が走っている状況です。
(先日UE4.21では再現しUE4.22では再現しないとご回答したのですが、誤ってActorHandleのAsyncActorの方でnullか否かを確認していました。大変申し訳ありません)
もしかすると何か検証手順に何か誤りがあるのかもしれませんので、お手数をおかけして申し訳ないのですが、再現プロジェクトをご用意頂けますと大変助かります。ご検討いただけますと幸いです。
よろしくお願いいたします。
お世話になっております。
UE4.21環境で再現を試みているのですが、未だ同様の現象を確認できてなく FBodyInstance::UpdatePhysicalMaterials
における FPhysicsCommand::ExecuteWrite
, ApplyMaterialToInstanceShapes_AssumesLocked
共に処理が走っている状況です。
(先日UE4.21では再現しUE4.22では再現しないとご回答したのですが、誤ってActorHandleのAsyncActorの方でnullか否かを確認していました。大変申し訳ありません)
もしかすると何か検証手順に何か誤りがあるのかもしれませんので、お手数をおかけして申し訳ないのですが、再現プロジェクトをご用意頂けますと大変助かります。ご検討いただけますと幸いです。
よろしくお願いいたします。
link text
お世話になっております。
ue4.20とue4.21のプロジェクトを用意しました。
よろしくお願いいたします。
お世話になっております。
回答が遅くなり大変申し訳ありません。頂いたプロジェクトを用いることで、4.20と4.21における挙動の違いを確認いたしました。
Weld Simulated Bodiesをtrueに指定したAttachToComponentを行った場合、ご指摘の通り ActorHandleがReleaseされるため、 UpdatePhysicalMaterials()
における FPhysicsCommand::ExecuteWrite(ActorHandle, [&](const FPhysicsActorHandle& Actor)
で弾かれてしまっていました。そこで、この判定処理を以下のように書き換えると SetPhysMaterialOverride
が正常に動作することを確認いたしました。
void FBodyInstance::UpdatePhysicalMaterials()
{
SCOPE_CYCLE_COUNTER(STAT_UpdatePhysMats);
UPhysicalMaterial* SimplePhysMat = GetSimplePhysicalMaterial();
TArray ComplexPhysMats = GetComplexPhysicalMaterials();
//FPhysicsCommand::ExecuteWrite(ActorHandle, [&](const FPhysicsActorHandle& Actor)
FPhysicsCommand::ExecuteWrite(GetActorReferenceWithWelding(), [&](const FPhysicsActorHandle& Actor)
{
ApplyMaterialToInstanceShapes_AssumesLocked(SimplePhysMat, ComplexPhysMats);
});
}
動作を完全に保証できるほどのテストはできていないのですが、 GetActorReferenceWithWeldingのコードは以下の通りWeldを考慮した関数ですので、少なくとも今回のような状況においては悪くない修正方法かと思います。
const FPhysicsActorHandle& FBodyInstance::GetActorReferenceWithWelding() const
{
return WeldParent ? WeldParent->ActorHandle : ActorHandle;
}
まずは上記の対応を一度試して頂けますと幸いです。
よろしくお願いいたします。
ご返答ありがとうございます。
教えていただいた方法で正常に動作するのを確認しました。
今後のバージョンで修正予定などありますでしょうか?
お世話になっております。
昨日に以下の番号で修正依頼をかけた所ですので、まだ今後の予定に関しては決まっていない状況です。
UE-74239 SetPhysMaterialOverride does not work properly when using Weld Simulated Bodies enabled AttachToComponent func (公開申請が通り次第確認可能になります)
申し訳ありませんが、今後の予定などが固まるまでご共有させて頂いた方法を暫定的対応として頂けますと幸いです。
よろしくお願いいたします。