ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
Unreal Engine 5(UE5)で「プレイヤーがアイテムに近づき、キー(ボタン)を押すとイベントが発火する」インタラクションは、範囲検知(コリジョンのオーバーラップ)で「近接中フラグ」を管理し、入力時にそのフラグで分岐して対象アイテムのカスタムイベントを呼び出す、という3要素の組み合わせで実装します。本記事ではブループリントを使い、Enhanced Input を前提にした基本形を手順ごとに解説します。
| この記事の要点 |
|---|
|
全体の仕組み:範囲検知+入力+イベント発火
近接インタラクションは、機能を3つに分解すると迷わず作れます。それぞれの役割と「どこに置くか」を先に押さえておきましょう。
| 要素 | 役割 | 主な配置場所 |
|---|---|---|
| 範囲検知 | プレイヤーがアイテムの近くにいるかを判定し、フラグで状態を持つ | アイテム側のブループリント(コリジョンのオーバーラップ) |
| 入力 | キー(ボタン)押下を受け取り、近接中だけ実行に進める | プレイヤー側(キャラクター/コントローラー) |
| イベント発火 | 近接かつ入力ありのとき、アイテム固有の処理を実行する | アイテム側のカスタムイベント |
ポイントは、「近づいたかどうか」と「ボタンを押したかどうか」を別々に検知し、両方が成立したときだけ発火するという設計です。状態(近接中フラグ)と入力(瞬間的なイベント)を分けておくと、後から「長押しで実行」「複数アイテム対応」などの拡張も入れやすくなります。
手順1:範囲検知(コリジョンで「近づいた状態」をbool管理)
まずアイテム側で、プレイヤーが近づいたことを検知します。検知範囲には Sphere Collision(全方向に均一な球状の範囲)が扱いやすく、四角い範囲が良ければ Box Collision でも構いません。
- アイテム用のブループリント(親クラス Actor など)を開く。
- 「コンポーネントを追加」から Sphere Collision を追加し、半径(Sphere Radius)を検知したい距離に合わせる。
- そのコリジョンの「コリジョン プリセット」を、プレイヤーとオーバーラップを生成する設定にする(例:Overlap All Dynamic など。プロジェクトのコリジョン設定に合わせて調整)。
- 「Generate Overlap Events(オーバーラップイベントを生成)」が有効になっていることを確認する。
次に、アイテムのイベントグラフで「いま近接中か」を表す bool 変数(ここでは bPlayerInRange とします)を用意し、オーバーラップの開始・終了で切り替えます。コンポーネントを選択し、詳細パネル下部のイベント欄から On Component Begin Overlap と On Component End Overlap を追加してください。
On Component Begin Overlap(Sphere Collision) |
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) |
Enhanced Input のノードは「EnhancedInputAction (IA_Interact)」という形でグラフに置け、押した瞬間に対応する Triggered 実行ピンから処理が流れます。ここで近接フラグ(または対象参照の有効性)を必ず通すことで、「近くにいるときだけボタンが効く」挙動になります。
手順3:イベント発火(アイテムのカスタムイベント呼び出し)
最後に、実際に「何が起きるか」をアイテム側に実装します。アイテムのブループリントにカスタムイベント(例:OnInteracted)を作り、その中に消滅・取得・エフェクト・ドア開閉など、アイテム固有の処理を入れます。
- アイテムのブループリントで右クリック →「カスタムイベントを追加」→ 名前を
OnInteractedにする。 OnInteractedの先に、実行したい処理(例:Spawn Emitter、Play Sound、Destroy Actor、インベントリ追加など)をつなぐ。- 手順2の「インタラクト用イベントを呼ぶ」部分から、対象アイテムの
OnInteractedを呼び出す。
(プレイヤー側)Current Interactable → Call OnInteracted |
カスタムイベントを経由させると、アイテムの種類ごとに処理を差し替えられるのが利点です。「鍵を拾う」「スイッチを入れる」「会話を始める」など、見た目や効果が違っても、プレイヤー側の入力処理は共通のまま使い回せます。なお、複数種類のアイテムを統一的に扱いたい場合は、ブループリントインターフェースを用意し、各アイテムにインタラクト用関数を実装させる方法もよく使われます(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手順(範囲検知・入力・イベント発火)を押さえれば、アイテム取得だけでなく、ドアの開閉やスイッチ操作など、さまざまな近接インタラクションへ応用できます。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- 床の上に乗ったらイベントを発生させる方法
- OverlapAllDynamicとOverlapAllの違い
- タイトル画面を作る方法
- サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
- ボタンに文字を記載する方法
- Event ActorBeginOverlapとOn Component Begin Overlapの違い
- キャラクターに特定のオブジェクトとの当たり判定を付ける
- 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
- 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
- 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
- Blenderファイルをインポートする方法
- 鏡を作成する方法
- レベルブループリントでキャラクターの出現を設定する方法
- サードパーソンテンプレートにおけるキャラクター出現の定義
- アイテムに近づいたらボタンを押してイベントを発火させる方法
- 画面の中央にメッセージを表示する方法
- どこからでも呼び出せるカスタムイベントを作成する方法
- カスタムイベントに引数を追加する方法
- 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
- オブジェクトに近づいている間だけメッセージを表示する方法
- PCの画面を操作するUIを作る方法
- コンテンツブラウザに画像を追加する方法
- SetInputMode_UIOnlyを取り消す方法
- 特定の画像の上にマウスカーソルを置いたら手マークにする方法
- オブジェクトがアウトライナーで選択できない原因と解決策
- PlayerStartを作成する方法
- メニュー画面を作成して開く方法
- 「Esc」キーを押してメニュー画面を開く方法
- イベントの「On Clicked」と「On Pressed」の違い
- 「Set Input Mode」の種類と使い方
- 「Set Game Paused」の使い方と詳細解説
- Motion Matchingとは?
- 「GameMode」と「GameModeBase」の違い
- マップに配置したTargetPointを取得する方法
- TargetPointにタグをつけて取得する方法
- Spawnしたインスタンスがイベントを実行する方法
- 特定の時間ごとに処理を実行する方法
- 数値をランダムで出力する方法
- ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
- MaxWalkSpeedを変更する方法
- しゃがむ動作を導入する方法
- キャラクターのアニメーションを設定する方法
- 導入済みのプラグインを確認する方法
- Motion Matchingの導入と必要なプラグイン
- プレイヤーを非表示にする方法
- カメラを傾ける角度を制限させる方法
- 配列からランダムに重ならない要素を特定の数取得する方法
- カメラの映す画面に文字やエフェクトを付ける方法
- キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
- プライマリーデータアセットを活用する方法
- プレイヤーのHPといった変数を定義する最適な場所
- カメラに映った画面をスクリーンショットとして保存する方法
- ゲーム内のカメラ映像を保存して再表示する方法
- HighResShot を使って高解像度の画像を保存する方法(UE5)
- HighResShotで保存した画像のファイル名を取得する方法
- SceneCapture2DとFrameGrabberの画像保存方法の比較
- SceneCapture2Dを使用して画像を保存・取得する方法
- HighResShotとTake High Res Screenshotの違い
- ゲーム終了ボタンを作成する方法
- 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
- 画面上にメッセージを指定された時間表示させる方法
- シェーダコンパイル時間を短縮する方法
- 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
- データベースを活用する方法
- UE5.5がインストールされた環境にUE5.4を追加で導入する方法
- World PartitionとWorld Compositionの違い
- オープンワールドテンプレートとは?
- ポーンをスポーンさせても視点を切り替えない方法
- キャラクター同士がすり抜けてしまう問題の解決方法
- キャラクターの外見を動的に変更
- World Partitionでインスタンスが「アンロード済み」になる問題
- データ アセットとデータ テーブルの違い
- コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
- エディターのソースコードの自動保存の頻度を高める方法
- SpawnActorでSpawn Transform Rotationが反映されない理由
- ミニマップを表示しポーンの位置を反映する方法
- RInterp ToとVInterp Toの違い
- 毎秒実行するイベントの定義方法
- Niagara のエフェクトにコリジョンを持たせる方法
- 「Overlap」と「Hit」の違い
- OverlapはあるがHitがない原因
- Overlapした位置の座標を取得する方法
- ブループリントでレベル間のパラメータを受け渡す方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?