お世話になっております。
Editor にて “End” キーを押すと選択アクターが地面に接地すると思うのですが、
プロジェクトで使用している地形 ( StaticMeshActor ) では接地せず原因を調べていました。
このの Collision 設定は

のようになっており、例えば BlockAll と比較すると オブジェクト型 WorldStatic を「無視する」に設定しているところが異なります。 WorldStatic 同士ではコリジョンは不要なのでこちらを「無視する」に設定しています。
接地処理を調べると
- FLevelEditorActionCallbacks::SnapTo_Clicked
- UEditorEngine::SnapObjectTo
- if (Object.GetWorld()->SweepSingleByChannel(Hit, StartLocation, StartLocation + Direction*WORLD_MAX, FQuat::Identity, ECC_WorldStatic, FCollisionShape::MakeBox(Extent), Params))
で処理されていて、SweepSingleByChannel で処理しているようです。上記の CP_Terrain のオブジェクトタイプは WorldStatic ですのでこの Sweep でひっかかりそうなものですが、そうでもないようです…
こちらのコリジョンへの理解が正確でないとは思いますが、なぜこのような挙動になっているのか教えて頂けないでしょうか。
それではよろしくお願い致します。
お世話になっております。
SweepSingleByChannelの引数としてECC_WorldStaticが固定で指定されているため、ObjectResponses(オブジェクト型)はWorldStaticがBlockで無くてはなりません。上記ではWorldStaticがIgnore(無視する)となっているため、Sweepに反応せず接地が効きません。上記でオブジェクトタイプをWorldStaticに設定されていますが、こちらはオブジェクト自身の属性を示すものであるためレスポンスとは別物となります。よってこのテラインに対するスナップを有効にするにはUEditorEngine::SnapObjectToで固定で指定されているECC_WorldStaticを別のチャネルに変更して頂くか、テラインのObjectResponses(オブジェクト型)でWorldStaticをブロックできるように変更して頂く必要があります。
よろしくお願いします。
ご回答ありがとうございます。
「テラインのObjectResponses(オブジェクト型)でWorldStaticをブロックできるように変更」によって解決したいと思います。
1点確認させて頂きたいのですが、上記の設定をすることで、WorldStatic 同士のペアもコリジョン処理に渡ってしまってコリジョン負荷が上がってしまうことはないのでしょうか?
ご回答ありがとうございます。
コリジョンレスポンスの設定(の一部)が、PhysX の FilterShader で使われるという理解でいましたので、念のため確認させて頂きました。
地形については、(当たり前ですが)Simulation フラグはオフですので負荷上昇にはつながらなそうです。
ありがとうございました。
ご返答ありがとうございます。
WorldStaticのオブジェクト同士が衝突を行うのであればコリジョンの負荷にはなり得ますが、テレインは静的なオブジェクト(動くことが無い)なのでテレイン自体からの物理シミュレーションや衝突のコストは考慮しない点と、そもそも"WorldStatic"と静的であることを定義しているはずのオブジェクト同士が衝突(オブジェクトの移動を行う)ことは、ObjectTypeの設定を見直す必要があるかと思います。よって、まずはコンテンツでWorldStaticをブロックする必要があるかどうかをご検討(見た目やオブジェクトの動作に影響しますので)頂くのがよろしいかと思います。