【UE5】メッシュをソケットにアタッチする方法

に公開

はじめに

ゲームでプレイヤーに何かを持たせたい場合、持ちたい物を別メッシュで用意してプレイヤーの何かにアタッチする方法がありますが、UEでも指定のボーンやソケットにアタッチすることができるようなので試してみました。

腕はコントロールリグを使ってスティックで動かしています。
手のソケットとボールをアタッチしておき、投げる時にデタッチ、キャッチするときに再度アタッチするという流れで動きを作ることができました。

アタッチの設定

アタッチには「AttachActorToComponent」というノードを使用しました。

  • targetにアタッチしたいアクターのBPのオブジェクト参照を設定
  • Parentにアタッチ先の親となるBPのオブジェクト参照を設定
  • SocketNameにアタッチ先のソケット名を記入
  • LocationRuleで位置をどのように処理するかを設定
  • RotationRuleで回転をどのように処理するかを設定
  • ScaleRuleでスケールをどのように処理するかを設定

デタッチの設定

デタッチには「DetachFromComponent」というノードを使用しました。

設定方法は基本的に「AttachActorToComponent」と同じで、ソケットの名前はこちらでは指定する必要はありません。

ボールを上に投げる

今回のケースではデタッチ設定のLocationRuleをKeepRelativeにすると一瞬でボールがどこかへ行ってしまいました。ボールはなるべく一定の高さに投げるようにしたかったため、以下のような仕組みにしています。

  • デタッチする際のLocationRuleをKeepWorldにしてワールドの位置を維持した状態にする
  • SetSumulatePhysicsでボールに物理を適用
  • SetPhysicsLinearVelocityで上方向に力を加える

ボールをキャッチする

アタッチするタイミングを検知するためにプレイヤーの手に専用のコリジョンを用意しました。ボールがそのコリジョンに重なったらアタッチ処理を開始するようにしています。

  • OnComponentBeginOverlapは重なりを検知したら起動します
  • CastTo~で重なったのがボールのBPだったらオブジェクトを取得
  • SetSumulatePhysicsでボールの物理を無効に
  • AttachActorToComponentでボールをソケットにアタッチ

Discussion