15.

UE5でアイテムに近づきボタンで発火するインタラクションの作り方

編集

Unreal Engine 5(UE5)で「プレイヤーがアイテムに近づき、キー(ボタン)を押すとイベントが発火する」インタラクションは、範囲検知(コリジョンのオーバーラップ)で「近接中フラグ」を管理し、入力時にそのフラグで分岐して対象アイテムのカスタムイベントを呼び出す、という3要素の組み合わせで実装します。本記事ではブループリントを使い、Enhanced Input を前提にした基本形を手順ごとに解説します。

この記事の要点
  • インタラクションは「範囲検知」「入力」「イベント発火」の3つに分けて考えると整理しやすい。
  • アイテム側に Sphere Collision(または Box Collision)を置き、On Component Begin Overlap / End Overlap で「いま近接中か」を bool 変数で管理する。
  • 入力は Enhanced Input(UE5 標準)の Input Action を使い、近接中フラグで Branch 分岐してから発火する。
  • 発火は対象アイテムのカスタムイベントを呼ぶ形にすると、消滅・取得・エフェクトなどアイテムごとに処理を差し替えられる。
  • 「Eを押す」などのUIヒントはオーバーラップ開始/終了で表示・非表示を切り替える。
  • 複数アイテム同時近接・オーバーラップ終了時のフラグ戻し・入力の有効化は典型的な落とし穴なので最後に確認する。

全体の仕組み:範囲検知+入力+イベント発火

近接インタラクションは、機能を3つに分解すると迷わず作れます。それぞれの役割と「どこに置くか」を先に押さえておきましょう。

要素 役割 主な配置場所
範囲検知プレイヤーがアイテムの近くにいるかを判定し、フラグで状態を持つアイテム側のブループリント(コリジョンのオーバーラップ)
入力キー(ボタン)押下を受け取り、近接中だけ実行に進めるプレイヤー側(キャラクター/コントローラー)
イベント発火近接かつ入力ありのとき、アイテム固有の処理を実行するアイテム側のカスタムイベント

ポイントは、「近づいたかどうか」と「ボタンを押したかどうか」を別々に検知し、両方が成立したときだけ発火するという設計です。状態(近接中フラグ)と入力(瞬間的なイベント)を分けておくと、後から「長押しで実行」「複数アイテム対応」などの拡張も入れやすくなります。

手順1:範囲検知(コリジョンで「近づいた状態」をbool管理)

まずアイテム側で、プレイヤーが近づいたことを検知します。検知範囲には Sphere Collision(全方向に均一な球状の範囲)が扱いやすく、四角い範囲が良ければ Box Collision でも構いません。

  • アイテム用のブループリント(親クラス Actor など)を開く。
  • 「コンポーネントを追加」から Sphere Collision を追加し、半径(Sphere Radius)を検知したい距離に合わせる。
  • そのコリジョンの「コリジョン プリセット」を、プレイヤーとオーバーラップを生成する設定にする(例:Overlap All Dynamic など。プロジェクトのコリジョン設定に合わせて調整)。
  • 「Generate Overlap Events(オーバーラップイベントを生成)」が有効になっていることを確認する。

次に、アイテムのイベントグラフで「いま近接中か」を表す bool 変数(ここでは bPlayerInRange とします)を用意し、オーバーラップの開始・終了で切り替えます。コンポーネントを選択し、詳細パネル下部のイベント欄から On Component Begin OverlapOn Component End Overlap を追加してください。

On Component Begin Overlap(Sphere Collision)
  → Cast To <プレイヤーキャラクター>(Other Actor を入力)
    成功 → Set bPlayerInRange = true

On Component End Overlap(Sphere Collision)
  → Cast To <プレイヤーキャラクター>(Other Actor を入力)
    成功 → Set bPlayerInRange = false

Cast を挟むのは、触れてきたアクターが本当にプレイヤーかを確認するためです(敵や他のオブジェクトがコリジョンに入ってもフラグが立たないようにする)。これでアイテムは「近接中かどうか」を常に把握できる状態になります。

手順2:入力(Enhanced Input/近接中フラグで分岐)

UE5 では入力管理に Enhanced Input が標準採用されています(旧来の Action Mapping も使えますが、新規プロジェクトでは Enhanced Input が基本です)。インタラクション用の入力を用意しましょう。

  • Input Action(例:IA_Interact)を作成する。単純な押下なら値の型は Digital(bool)でよい。
  • Input Mapping Context(例:IMC_Default)に IA_Interact を追加し、E キーなど任意のキーに割り当てる。
  • プレイヤー側で、その Mapping Context が有効化(Add Mapping Context)されていることを確認する。これを忘れると入力自体が届きません。

入力を受け取る場所は、プレイヤーキャラクターやプレイヤーコントローラーなど、入力処理をまとめている場所です。ここで「近接中か」を判定し、対象アイテムへ橋渡しします。フラグはアイテム側にあるため、どのアイテムが近接中かをプレイヤー側が参照できるようにする必要があります。実装方法はいくつかありますが、代表的なのは次の2通りです。

  • プレイヤー側に「現在対象アイテム」参照を持たせる方法:手順1のオーバーラップ開始時に、アイテムが自分自身をプレイヤーへ登録し(Current Interactable に Set)、終了時にクリアする。入力時はこの参照が有効かどうかで分岐する。
  • アイテム側で完結させる方法:入力イベントをアイテム側で受け、自分の bPlayerInRange で分岐する(小規模なら手軽だが、アイテムごとに入力受け取りが必要)。

ここでは前者(プレイヤーが対象アイテム参照を持つ)を基本形として示します。入力時のフローは次の通りです。

EnhancedInputAction IA_Interact(Triggered)
  → Branch(条件:Current Interactable Is Valid ?)
    True → Current Interactable に対して「インタラクト用イベント」を呼ぶ
    False → 何もしない

Enhanced Input のノードは「EnhancedInputAction (IA_Interact)」という形でグラフに置け、押した瞬間に対応する Triggered 実行ピンから処理が流れます。ここで近接フラグ(または対象参照の有効性)を必ず通すことで、「近くにいるときだけボタンが効く」挙動になります。

手順3:イベント発火(アイテムのカスタムイベント呼び出し)

最後に、実際に「何が起きるか」をアイテム側に実装します。アイテムのブループリントにカスタムイベント(例:OnInteracted)を作り、その中に消滅・取得・エフェクト・ドア開閉など、アイテム固有の処理を入れます。

  • アイテムのブループリントで右クリック →「カスタムイベントを追加」→ 名前を OnInteracted にする。
  • OnInteracted の先に、実行したい処理(例:Spawn Emitter、Play Sound、Destroy Actor、インベントリ追加など)をつなぐ。
  • 手順2の「インタラクト用イベントを呼ぶ」部分から、対象アイテムの OnInteracted を呼び出す。

(プレイヤー側)Current Interactable → Call OnInteracted

(アイテム側)Custom Event OnInteracted
  → Play Sound / Spawn Effect など
  → Destroy Actor(取得して消す場合)

カスタムイベントを経由させると、アイテムの種類ごとに処理を差し替えられるのが利点です。「鍵を拾う」「スイッチを入れる」「会話を始める」など、見た目や効果が違っても、プレイヤー側の入力処理は共通のまま使い回せます。なお、複数種類のアイテムを統一的に扱いたい場合は、ブループリントインターフェースを用意し、各アイテムにインタラクト用関数を実装させる方法もよく使われます(Cast を減らせて拡張しやすい)。

補足:「Eを押す」UIヒントの表示

近づいたときに「E でひろう」のようなヒントを出すと、プレイヤーに操作が伝わります。これは手順1のオーバーラップ開始・終了に合わせて表示を切り替えるだけです。

  • ヒント用のウィジェット(UMG)やアイテム上に置く Widget Component を用意する。
  • On Component Begin Overlap(プレイヤーと確認後)→ ヒントを表示(Set Visibility / Set Hidden in Game を解除)。
  • On Component End Overlap → ヒントを非表示に戻す。

キー名を画面に出す際、ハードコーディングで「E」と書くと、後でキー設定を変えたときに表示とズレます。表示とキー割り当てを一致させたい場合は、Enhanced Input から現在の割り当てキーを取得する仕組みの利用も検討してください(実装の詳細は公式ドキュメントの確認を推奨します)。

落とし穴と対処

起きがちな問題 原因と対処
ボタンを押しても反応しないInput Mapping Context が有効化されていない/近接フラグ(対象参照)が立っていない。Add Mapping Context の実行と、Branch 条件の値を確認する。
離れても反応し続けるOn Component End Overlap でフラグを false に戻していない/対象参照をクリアしていない。終了側の処理を必ず実装する。
複数アイテムに同時に近接単純な bool だけだと「どのアイテムを操作するか」が曖昧になる。対象アイテムの参照を持つ方式にし、End Overlap では「今クリアしようとしている対象が現在の対象と同じとき」だけクリアするなど、入れ替わりを考慮する。
プレイヤー以外でフラグが立つOther Actor の Cast を省略している。プレイヤーかどうかを必ず判定する。
そもそもオーバーラップが発生しないコリジョンのプリセットが Overlap になっていない/Generate Overlap Events が無効/プレイヤー側のコリジョン設定と噛み合っていない。両者のコリジョン応答を確認する。

FAQ

Q1. Sphere Collision と Box Collision のどちらを使うべきですか?
全方向に均一な検知範囲なら Sphere、ドアや棚など方向や形が重要なら Box が向きます。挙動の本質(オーバーラップでフラグ管理)は同じなので、見た目と用途で選んで問題ありません。

Q2. 旧来の Action Mapping(Project Settings の Input)でも作れますか?
作れます。InputAction イベント(旧式)で押下を受け取り、同じく近接フラグで Branch するだけです。ただし UE5 の新規プロジェクトでは Enhanced Input が標準のため、特に理由がなければ Enhanced Input をおすすめします。互換の細部はバージョンで異なることがあるため、公式ドキュメントの確認を推奨します。

Q3. 「長押しで実行」や「ゲージをためて発火」にしたい場合は?
Enhanced Input には押下のされ方を判定する Trigger(Hold など)の仕組みがあり、これを Input Action に設定すると長押し判定を比較的手軽に組めます。設定値の意味や挙動はバージョンによって差があるため、導入時は公式ドキュメントで最新の仕様を確認してください。

以上の3手順(範囲検知・入力・イベント発火)を押さえれば、アイテム取得だけでなく、ドアの開閉やスイッチ操作など、さまざまな近接インタラクションへ応用できます。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 床の上に乗ったらイベントを発生させる方法
  2. OverlapAllDynamicとOverlapAllの違い
  3. タイトル画面を作る方法
  4. サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
  5. ボタンに文字を記載する方法
  6. Event ActorBeginOverlapとOn Component Begin Overlapの違い
  7. キャラクターに特定のオブジェクトとの当たり判定を付ける
  8. 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
  9. 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
  10. 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
  11. Blenderファイルをインポートする方法
  12. 鏡を作成する方法
  13. レベルブループリントでキャラクターの出現を設定する方法
  14. サードパーソンテンプレートにおけるキャラクター出現の定義
  15. アイテムに近づいたらボタンを押してイベントを発火させる方法
  16. 画面の中央にメッセージを表示する方法
  17. どこからでも呼び出せるカスタムイベントを作成する方法
  18. カスタムイベントに引数を追加する方法
  19. 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
  20. オブジェクトに近づいている間だけメッセージを表示する方法
  21. PCの画面を操作するUIを作る方法
  22. コンテンツブラウザに画像を追加する方法
  23. SetInputMode_UIOnlyを取り消す方法
  24. 特定の画像の上にマウスカーソルを置いたら手マークにする方法
  25. オブジェクトがアウトライナーで選択できない原因と解決策
  26. PlayerStartを作成する方法
  27. メニュー画面を作成して開く方法
  28. 「Esc」キーを押してメニュー画面を開く方法
  29. イベントの「On Clicked」と「On Pressed」の違い
  30. 「Set Input Mode」の種類と使い方
  31. 「Set Game Paused」の使い方と詳細解説
  32. Motion Matchingとは?
  33. 「GameMode」と「GameModeBase」の違い
  34. マップに配置したTargetPointを取得する方法
  35. TargetPointにタグをつけて取得する方法
  36. Spawnしたインスタンスがイベントを実行する方法
  37. 特定の時間ごとに処理を実行する方法
  38. 数値をランダムで出力する方法
  39. ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
  40. MaxWalkSpeedを変更する方法
  41. しゃがむ動作を導入する方法
  42. キャラクターのアニメーションを設定する方法
  43. 導入済みのプラグインを確認する方法
  44. Motion Matchingの導入と必要なプラグイン
  45. プレイヤーを非表示にする方法
  46. カメラを傾ける角度を制限させる方法
  47. 配列からランダムに重ならない要素を特定の数取得する方法
  48. カメラの映す画面に文字やエフェクトを付ける方法
  49. キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
  50. プライマリーデータアセットを活用する方法
  51. プレイヤーのHPといった変数を定義する最適な場所
  52. カメラに映った画面をスクリーンショットとして保存する方法
  53. ゲーム内のカメラ映像を保存して再表示する方法
  54. HighResShot を使って高解像度の画像を保存する方法(UE5)
  55. HighResShotで保存した画像のファイル名を取得する方法
  56. SceneCapture2DとFrameGrabberの画像保存方法の比較
  57. SceneCapture2Dを使用して画像を保存・取得する方法
  58. HighResShotとTake High Res Screenshotの違い
  59. ゲーム終了ボタンを作成する方法
  60. 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
  61. 画面上にメッセージを指定された時間表示させる方法
  62. シェーダコンパイル時間を短縮する方法
  63. 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
  64. データベースを活用する方法
  65. UE5.5がインストールされた環境にUE5.4を追加で導入する方法
  66. World PartitionとWorld Compositionの違い
  67. オープンワールドテンプレートとは?
  68. ポーンをスポーンさせても視点を切り替えない方法
  69. キャラクター同士がすり抜けてしまう問題の解決方法
  70. キャラクターの外見を動的に変更
  71. World Partitionでインスタンスが「アンロード済み」になる問題
  72. データ アセットとデータ テーブルの違い
  73. コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
  74. エディターのソースコードの自動保存の頻度を高める方法
  75. SpawnActorでSpawn Transform Rotationが反映されない理由
  76. ミニマップを表示しポーンの位置を反映する方法
  77. RInterp ToとVInterp Toの違い
  78. 毎秒実行するイベントの定義方法
  79. Niagara のエフェクトにコリジョンを持たせる方法
  80. 「Overlap」と「Hit」の違い
  81. OverlapはあるがHitがない原因
  82. Overlapした位置の座標を取得する方法
  83. ブループリントでレベル間のパラメータを受け渡す方法

最近更新/作成されたページ