mgsue
(mgsue)
1
こんにちは。公式Documentのクイックスタートを勉強中の者です。
不具合が発生したため、再現しやすい環境を整えました。
(デフォルト状態の){ThirdPersonCharacter}Actaを
[Multi ( Sphere ) Trace For Objects]ノードを使い、取得したいと考えています。
Object TypesをPawnにすることで確かに取得できました。
しかし、[Multi Trace]ノードのOut Hitsを[LENGTH]で見た所、複数取得していました。
「23」個取得していることが分かりました。
{ThirdPersonCharacter}Actaの構成でObject TypesがPawnの物は
1.Mesh
2.capsuleComponent
の2つなのでLength値は2になると予想していました。
なぜ[23]個も取得されたのでしょうか?
1つだけ取得する方法はありませんか?
–補足–
Out Hitsの配列を[ForEachLoop]で分解し、
Hit Bone nameを確認すると、複数の名前が出力されました(重複もある)。
しかし、hitした数[23]と、{ThirdPersonCharacter}ActaのSkeletonAssetのボーンの数は一致しません。
これはこれで謎ですが、本質問これが原因ではなさそうと考えています。
同じ内容で質問している方がすでにいました。
–以下追記–
ThirdPersonCharacterをデフォルトから下記の状態に変更しました。
(コリジョン プリセット = Custom)
Object Type = Pawn
トレース応答のVisibility = Block
そこで、
・Multi Trace by Channelで(Trace Channel = Visibility)→22個Hit
・Multi Trace by Objectで(Object Types = Pawn)→23個Hit
しました。
(Object Type の方が一つ多いのはcapsuleComponentです。)
(以下、Multi Trace by Objectでの検証です)
自前の3Dデータを
StaticMeshとしてインポートしたところ,1個Hitし、
SkeletalMeshとしてインポートしたところ,2個Hitしました。
SkeletalMeshを「[スケルタルメッシュからスタティックメッシュへの変換][2]」に従って
2つの方法でStaticMeshにして検証したところ、両方共に0個Hitしました。
creatorue
(creatorue)
2
根本的な解決にはならないと思いますが、そういうことならfor Objectの方ではなく、by Channelの方でやってみてはどうでしょうか
alwei
(alwei)
3
通常1つのコリジョンのトレースが欲しければ『Multi Line Trace』ではなく『Line Trace』を使います。Multi版を使うと複数のトレースを取得することができます。
ただ、『~ForObjects』と『~ByChannel』では挙動が変わります。前者は線上に存在するオブジェクトを全て取得します。後者は線上にある最初にヒットしたオブジェクトのみを返します。
最後にこのノードだとStartとEndが同じになっているため、ただしくトレースができない状態です。(少しでも差が必要)
mgsue
(mgsue)
4
クイックスタートでfor Objectが利用されていましたし、こちらの方が頭で理解しやすいため利用しました。(Visibilityは分かってもCameraはいつ使うのかなど、まだ勉強不足の状態でしたので。)
アドバイス通りにby Channelを利用しても同じ結果でした…
mgsue
(mgsue)
5
ご指摘ありがとうございます。
Line Traceの場合はStartと違う値をEndに指定するのは分かりますが、ボリューム?範囲指定できるものもEnd値を入れないと行けないのですね!
Debugの見た目では上手くいっているように見えるのでしっかり覚えておきます。
Multi Trace ノードを使い、任意のActaを取得する方法にはどのようなものがありますか?
すぐに思いつくのは
方法1
[Multi Line Trace]のOut Hitsピンを[ForEachLoop]と[Break Hit Result]で一つづつ要素(Acta)を見ていき、
欲しい種類のActaなら以後の処理へ通す~。
デメリット:周囲にTargetと同じTrace Channel/Object TypeのものがあるとムダなLoopが多い。
方法2
『~ForObjects』『~ByChannel』どちらを使うにせよ、
Project設定のCollisionから、取得したいChannelしか反応しないような新規Channelを作る。
デメリット:新規に作れるのは18個が限界。
Multi Traceで取得したActaを配列番号でGet抽出したい場合は個を特定できないと思うのですが、
考えあっていますでしょうか?
長々と失礼いたしました。
出力自体は不具合ではありません
ここで引っかかっているのは、 ThirdPersonCharacter
で使用されている SK_Mannequin
に適用された物理アセットのコンポーネント(Collision)です
物理アセットが22個のCollisionを所持しています
物理アセットは Content/Mannequin/Character/Mesh/SK_Mannequin_PhysicsAsset
にあるので、図のようにBone Nameを出力してそれぞれ対応しているかどうか確かめてみると良いでしょう
MultiSphereTraceForObjectsでActor1つに付き1つだけ取りたいとのことですので、一例を提示します
まず Project Settings > Engine > Collision
で、ObjectChannelを追加します
次に、検索したいActorにCollisionを追加し、CollisionのObjectTypeを先程追加したものに変更します
(既存のCapsuleComponentを編集するのはおすすめしません)
その後は、MultiSphereTraceForObjectsのObjectTypesに、先程追加したObjectTypeを指定すれば検索可能になります
mgsue
(mgsue)
7
非常に分かりやすい画像解説付きでありがとうございます。
物理アセットから22個のコリジョンを確認できました。
モヤモヤを取り去ることができました。感謝いたします。
物理アセットについてまだ何も手を付けたことがないのですが、
コンポーネント(Collision)を選択して、詳細タブ/Collisionを確認すると、
Collision Response という設定がある程度で、その説明を読んでも
結果的に何として認識されるのかはその場では分からないです。
物理アセットの"親"/"所有者"のObject Type/Trace Channel になるということでしょうか?
ObjectTypeは物理アセットの所有者(親)であるSkeletalMeshComponentのCollision設定が適用されるようです