Actorに対して能動的にアタッチしたい

具体的にはモンハンの操虫棍の印や、ゴーストオブ対馬の石川ストックなどをUE5で実装したいです。
現状では、ヒットした時の位置とヒットした時のアクターのトランスフォームを変数に格納し、Tickで位置調整をすることで、どうにか追従するように見せかけています。

しかし、現状のロジックでは、ヒットしたアクターのアニメーションに対応できていない状態です。
ヒットした場所にソケットを能動的に生成できないか、など初心者ながら調べたのですが有益な情報は見つけることができませんでした。

私一人では、アニメーションに対して主要のボーンにソケットを随時追加して対応するくらいしか思いつきませんでした。
もし何か良い案があればぜひ教えていただきたいです。

例として挙げているものがイメージと正しければ、矢などが当たった場合にその場で人体に刺さったままにしたいということだと思うのですが

image
この類のノードでおそらく解決するのではと思います
(いくつか類似のノードがあるため場合に合わせてください)

これでこの設定をした時点での位置関係を維持したままアタッチが可能となるはずです

返信ありがとうございます。この方法で実装すると、ソケットを多く用意し、アタッチを実行する前にヒットポイントから最も近いソケットを「GetAllSocket」から検索してそのソケットにアタッチする方法になると思うのですが、大量のモデルがあると、そのすべてにソケットを用意する必要があります。モデルのスケルトンが複雑になると検索のコストも大きいと感じます。
Boneにアタッチはできないのでしょうか?公式ドキュメントによると「GetAllBoneName」という関数でBoneをすべて取得できる様なのですが、ブループリントでそのような関数は検索にヒットしませんでした。

Get All Bone Names | Unreal Engine 5.2 Documentation

@7b28c75f81654069b9ea
このSocketNameにBoneの名前を指定しても確かそのBoneの位置にアタッチが機能したと思いますよ

返信ありがとうございます
ヒットから最も近いBoneさえわかれば、多くのソケットを用意する必要はなさそうですね
ただ、Boneを取得するGetAllBoneNameが使用できない現状です

@7b28c75f81654069b9ea
今回のケースではGetAllSocketNamesで望む結果が得られると思います
また、そのドキュメント内ではTarget is Skin Weight Modifierと記載されていますので通常は使えません

ありがとうございます。これまでの情報があれば、実装は問題なくできそうなのですが、Target is Skin Weight Modifierについてお伺いしたいです。Modifierに関して無縁であったため、よくわかっておらず、少し調べてみたのですが、これはメッシュに対しての拡張機能的なものなのでしょうか?
Meshを持っているActorのBP内でTarget is Skin Weight Modifierの関数は呼び出せないのですか?ModifierはBP内で参照が可能なのでしょうか

@7b28c75f81654069b9ea
「Target is Skin Weight Modifier」という文言は「このAPIは SkinWeightModifier に含まれている」という意味で、呼び出すためにはSkinWeightModifier実体が必要です
SkinWeightModifier というのは SkeletalMeshModifiers モジュールの一部であり、 SkeletalMeshModifiers は MeshModelingToolsetExp という秘匿プラグイン("Hidden"属性がtrue)の一部です

MeshModelingToolsetExpは以下のプラグインで使われています
Beta:
ChaosEditor(デフォルトで有効)
Dataprep Geometry Operations
Modeling Tools Editor Mode(デフォルトで有効)
UVEditor(デフォルトで有効)
Experimental:
Chaos Cloth Asset Editor
ExampleCharacterFXEditor
Skeletal Mesh Editing Tools

このうちのどれか一つでも有効なら MeshModelingToolsetExp が、ひいては SkeletalMeshModifiers が読み込まれて、プロジェクトで有効になります
使い方はコメントで書かれています

 * API used to modify skin weights on a Skeletal Mesh asset.
 * 
 * To use:
 * 1. Instantiate an instance of USkinWeightModifier
 * 2. Call "SetSkeletalMesh(MyMeshAsset)", passing in the skeletal mesh you want to edit weights on
 * 3. Use Get/Set weights functions, and Normalize/Prune to edit the weights as desired
 * 4. When ready to commit to the asset, call CommitWeightsToSkeletalMesh() and save the asset if desired
 *
 * This API can be used from C++, Blueprint or Python.

ただしこの手順でもブループリントからは使用できませんでした
また、これを使用するソースコードも見つかりませんでした
使うにはご自分でプラグイン自体を、もしくはその中身をコピーする必要があるかと思います

1 Like

SkeletalMeshが特定できていて、それに適切にPhysicsAssetが設定されているならば、PhysicsAssetから近いBone名を特定できます

あとは取得したBone名でAttachすればよいでしょう

1 Like

みなさんありがとうございます。自分では限界を感じていて、改善が見られない問題でしたが、皆さんのおかげで今よりもよりよいものが作ることができそうです。勉強になりました。重ね重ねではありますが本当にありがとうございました。

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.