【Unreal Engine 5】初心者向けインタラクト機能の実践:「武器を拾って装備する」w/GASP-ALS

※本サイトはアフィリエイト広告を利用しています。

今回のテーマは、Unreal Engine 5での「アイテムを拾って装備する」基本的なインタラクト処理の作り方についてです。GASP(Game Animation Sample)とALS(Advanced Locomotion System)を融合されたGASP-ALSをベースに、ステップバイステップで解説していきます。

それではさっそく始めましょう!

ステップ0:基本的な考え方

現実では、拾う前と拾った後で同じものですが、ゲームでは「拾うもの」と「持ち物・装備品」は別なものとして扱い、(手品のように)とる瞬間に置き換えることがよくあります。

よっしー
よっしー

予想ですが、
まだ持ってない剣の刃に当たり判定があるととるときにダメージ受けちゃうとか、面倒くさいことになるので、
もってないとき用の機能追加や持っているときの機能無効化などを処理分岐して設計するのもなかなか大変
なので、「拾えるものクラス」を作って別な扱いにするほうが設計が簡単で不具合も少ないという意図なのかなと思います。

ステップ1:近づくとアイテムが消える仕組み

まずは、プレイヤーが近づいたときに自動で消えるアイテムを作成します。

1.1 ブループリントアクターの作成

  • ActorクラスのBlueprintを新規作成。
  • SkeletalMeshStaticMeshを両方コンポーネントに追加して、使わないほうは空にしておきます。
  • 今回はピストルのスケルタルメッシュを使います。

1.2 コリジョン設定とイベント

  • Sphere Collisionを追加し、Overlapイベントで処理を実行。
  • BeginOverlapイベントで自分自身をDestroy Actorで削除します。
よっしー
よっしー

デバッグ用に、コリジョンを「見える化」しておくと便利です。

Sphereを選択して、詳細欄から「Hidden in Game」ゲーム中隠れる のチェックを外す

これで、プレイヤーが接近しただけでピストルが消える処理が完成しました。

ステップ2:拾ったら自動で装備させる

ただ消えるだけではつまらないので、拾ったキャラクターに装備を変更させましょう。

2.1 キャラクター側の処理に接続

  • BeginOverlapイベント内で、自身を消す前に、装備変更イベントを呼び出すようにします。
  • 例:GASP-ALS環境なら、Qキーによる状態変更処理を参考に簡単に実装できます。
よっしー
よっしー

中級者向け:キャラクター型にキャストししたくない(依存関係をなるべく減らしたい)場合は、「インターフェース」という仕組みを使うのが一般的です。

2.2 武器種別に応じたオーバーレイステートを適用

  • ピストルを拾ったら「両手持ち状態」などに切り替え
    • 上図でUpdate Selected Overlayの新しい状態を変えています

これにより、UIのない環境(例:Qキーのオーバーレイ切り替えインベントリ無効)でも自動装備が可能になります。

よっしー
よっしー

PlaySound2D などで拾った音を鳴らすサウンドも追加すると、気持ちいいです。

ステップ3:キーを押したときだけ拾う処理へ

「近づいただけで拾ってしまう」のは不便なこともあります。次はEキーなどの操作でのみ拾うように変更します。

3.1 拡張入力アクションの追加

  • GASP-ALSの入力マップに「IA_Interact インタラクト用」のキーを追加(もとからあります。なければ新規作成)。
  • ValueType:Digital, Triggers: 押される で設定します。

3.2 重なったアクターの取得と判定

  • Get Overlapping Actorsで現在接触しているアクターを取得。
  • For Eachノードでループし、拾えるアイテムかどうかをCastで判定。
  • 成功したら、装備処理→アイテム削除の順で処理します。

CBP_SandboxCharacter > イベントグラフ > IA_Interact

「Eキーを押すとアイテムが拾える」インタラクト処理が完成!

ステップ4:アイテムごとに処理を分岐させる

現状だと、すべてのアイテムをピストルとして処理しています。ライフルなど他の武器にも対応させましょう。

4.1 処理をアイテム側に移す

  • 拾ったアイテムごとに異なる処理が必要になるため、アイテムのブループリント側にカスタムイベントを用意。
  • SandboxCharacterを引数で受け取り、キャスト不要に。

BP_PickUp > PickUpイベント(add custom eventで新規作成し、SphereのBeginOverlapEventを削除し置き換え)

  • 呼び出し側は、自分で処理するのをやめて、PickUpイベントを呼び出す形に変更

CBP_SandboxCharacter > イベントグラフ > IA_Interact (For Eachのあと部分)

4.2 オーバーレイステートを変数化

  • 「拾ったときの装備状態」をBlueprint変数として外部設定できるようにします。
よっしー
よっしー

これはこの後で子クラスにするときに切り替える用です。
Instance 編集可能にして、クラスはこのまま1つで、レベルに設置するときに個別設定する運用も可能です。

4.3 子クラスで処理分岐

  • ピストル用、ライフル用などの子ブループリントを作成。
  • 装備変更ステートをOverlayType変数のデフォルト値に設定。
  • レベル上で設置すれば完了

ステップ5:見た目を良くしよう

5.1 回転アニメーションの追加

  • Rotating Movementコンポーネントを追加し、くるくる回るエフェクトを簡単に実現できます。
  • 詳細欄から、1秒でどの向きに何度回転するか設定可能です。

5.2 インタラクト可能なアイコン表示

  • 新規ウィジェットを作成(名前は任意 ここでは WBP_Interact)
  • キャンバスパネル/画像を配置しアンカーで中央ぞろえに。
  • 画像を選択し、Brushから矢印画像を選択(お好みで)
  • BP_Pickupにウィジェット追加
  • アイテム本体の少し上に配置。
  • 近づいたときのみ表示されるように制御
    • Visibleをチェック外す
    • Set Visibilityを使って、オーバーラップ開始/終了で表示切り替え。
よっしー
よっしー

ふつうはこれで問題ありませんが、GASPだとオーバーラップイベントがチャタリングする場合があるので、チカチカしちゃいます。

応急処置として、Retriggerable Delayを挟んで遅延評価していますが、ちゃんとした対策にはなっていません

5.3 アイコンにアニメーションをつける

  • Widget Animationを作成し、上から下にふわふわ動くようにトランスフォームを設定。
  • イベントグラフに切り替え、Construct(ウィジェットが作られるタイミング)で再生回数0で無限ループに。

こうした見た目の工夫で、拾えるアイテムがぐっと目立つようになります。


ステップ6:拾うアニメーションの再生

6.1 Mixamoから拾う動作を入手

  • 「松明を拾う」アニメーションを右手用に反転し、インポート。
    • サイズを抑えるためにスキンは不要。
    • Mixamo ConverterでUE向けに調整

6.2 UE5でアニメーションモンタージュ化

  • リターゲットしてUEFNスケルトンに変換。
  • モンタージュを作成し、ピックアップ処理の冒頭で再生。
  • 再生後に装備切り替え処理をディレイで実行(例:2倍速化後の0.73秒後)。

6.3 再生速度の調整

  • モーションが遅い・速い場合は、PlayMontageのレートではなく、アニメーションモンタージュ自体の速度を変更して対応するほうがやり忘れが防げます。
    • ただし、キャラごと・状況で変えたい場合はこの限りではありません
  • より自然な装備タイミングに近づけるには、Anim Notifyを活用するのもおすすめです。

PlayMontageノードで受け取れる通知は、通常の通知ではなく「Montage Notify」です

まとめ

今回の記事では、Unreal Engineでのインタラクト実装の基本から応用までを、ステップバイステップでご紹介しました。最終的には、プレイヤーが近づいてキーを押すとアニメ付きで武器を拾い、装備する処理が完成します。

やってみると意外と簡単ですが、GASP-ALSとの連携を意識することでスケーラビリティの高い設計が可能になります。

よっしー
よっしー

YouTubeでご質問いただきましたが、アイテムが近くに重なっていると、1回の拾うモーションでまとめて一気に取得します。装備品はどっちの装備になるかは状況次第って感じです。もっとうまくやるには、ForEachの部分を改良して、どれか1つだけ処理するようにしましょう

「拾ったアイテムの管理と切り替え」についても後日取り上げたいと思います!

コメント

タイトルとURLをコピーしました