タイトル: オブジェクトに近づいている間だけメッセージを表示する方法
SEOタイトル: UE5でオブジェクトに近づいている間だけメッセージを表示する方法
Unreal Engine 5(UE5)でプレイヤーがオブジェクトに近づいている間だけメッセージを表示するには、対象オブジェクトに範囲検知用のコリジョン(Sphere CollisionやBox Collision)を付け、「On Component Begin Overlap」でメッセージを表示し、「On Component End Overlap」で消すのが基本です。範囲に入った瞬間に表示をOn、出た瞬間にOffへ切り替えるため、「近づいている間だけ」という条件をシンプルかつ確実に実現できます。毎フレーム距離を測る方法もありますが、Overlapイベントを使うほうが処理が軽く、表示/非表示のタイミングも管理しやすくなります。
| この記事の要点 |
|---|
|
仕組み:Overlapで表示をOn/Offする
「近づいている間だけ表示する」という挙動は、範囲の出入りを検知する仕組みと表示/非表示を切り替える仕組みの2つに分解できます。
範囲の検知には、対象オブジェクトに取り付けたコリジョン(当たり判定)を使います。プレイヤーがその範囲に入ると「Begin Overlap(重なり開始)」、範囲から出ると「End Overlap(重なり終了)」というイベントが発生します。この2つのイベントに、それぞれ「メッセージを表示する処理」と「メッセージを消す処理」をつなぐことで、近づいている間だけ表示される状態を作れます。
毎フレーム実行される「Event Tick」で距離を計算する方法もありますが、Overlapイベントは範囲の出入りが起きた瞬間にだけ呼ばれるため、無駄な計算が少なく、表示状態の切り替えタイミングも明確です。特別な理由がなければ、まずはOverlapイベントを使う方法から検討するとよいでしょう。
手順:画面UIとして表示する基本形
ここでは、メッセージを画面全体に重ねて表示する(HUDのように出す)基本的な手順を説明します。操作対象は、メッセージを出したいオブジェクトのBlueprint(アクターBlueprint)です。
1. 検知用のコリジョンを追加する
オブジェクトのBlueprintを開き、コンポーネントとしてSphere Collision(球状の範囲)またはBox Collision(箱状の範囲)を追加します。プレイヤーが「どのくらい近づいたら表示するか」を決める範囲なので、見た目のメッシュより少し大きめに設定するのが一般的です。Sphereなら「Sphere Radius」、Boxなら「Box Extent」で範囲の大きさを調整します。
追加したコリジョンを選択し、詳細(Details)パネルで以下を確認します。
- Generate Overlap Events(オーバーラップイベントを生成)が有効(チェックON)になっていること。
- Collision Presets(衝突プリセット)が、プレイヤーとOverlapする設定になっていること(例:OverlapAllDynamicや、プレイヤー側のチャンネルをOverlapにしたカスタム設定)。
2. 表示するメッセージ用のウィジェットを用意する
コンテンツブラウザで「Widget Blueprint(ウィジェットブループリント)」を新規作成し、Text(テキスト)などでメッセージの見た目を作ります。ここでは例として「WBP_Message」という名前にしたとします。文字列やデザインは、このウィジェット内で自由に編集できます。
3. Begin Overlapで表示する
オブジェクトのBlueprintのイベントグラフで、追加したコリジョンの「On Component Begin Overlap」イベントを追加します。コンポーネントを選択した状態で詳細パネル下部のイベント欄から追加するか、コンポーネントを右クリックして該当イベントを選びます。
このイベントから、次の流れでノードをつなぎます。
- Create Widget … 表示するクラスに「WBP_Message」を指定してウィジェットを生成します。
- 生成したウィジェットを変数として保持します(後で消すために参照が必要です)。
- Add to Viewport … 生成したウィジェットを画面に追加して表示します。
「重なった相手が本当にプレイヤーかどうか」を判定したい場合は、Begin Overlapの「Other Actor」をCast to(プレイヤーキャラクターのクラス)で確認し、成功したときだけ表示する形にすると、他のアクターに反応して誤って表示されるのを防げます。
4. End Overlapで非表示にする
同じコリジョンの「On Component End Overlap」イベントを追加し、保持しておいたウィジェット変数に対してRemove from Parentを実行します。これでビューポートからウィジェットが取り除かれ、メッセージが消えます。範囲から出るたびに確実に消えるよう、表示時と同じ参照を使って消すのがポイントです。
Begin Overlap: On Component Begin Overlap → (Cast to PlayerCharacterで判定) → Create Widget(WBP_Message) → 変数に保存 → Add to Viewport
End Overlap: On Component End Overlap → (Cast to PlayerCharacterで判定) → 保存したウィジェット変数 → Remove from Parent |
3D空間(オブジェクトの近く)に出す方法
画面全体ではなく、オブジェクトの真上や近くなど3D空間上にメッセージを浮かべたい場合は、Widget Component(ウィジェットコンポーネント)を使います。これはウィジェットを3Dの板(または常にカメラを向く表示)としてワールド内に配置できるコンポーネントです。
- オブジェクトのBlueprintにWidget Componentを追加し、表示位置(オブジェクトの上など)に配置します。
- 詳細パネルの「Widget Class」に、表示したいウィジェット(例:WBP_Message)を指定します。
- 「Space」をScreenにすると常にカメラ側を向き、文字が読みやすくなります。立体的な板として置きたい場合はWorldを選びます。
- 通常は最初から見えないよう、Widget Componentの可視性をオフ(非表示)にしておきます。
そのうえで、Begin OverlapでSet Visibility(またはSet Hidden in Game)を使ってWidget Componentを表示状態にし、End Overlapで再び非表示に戻します。この方法では、画面用ウィジェットのようにAdd to Viewport/Remove from Parentを毎回行う必要はなく、表示/非表示を切り替えるだけで済みます。
複数オブジェクトを扱う場合
同じ仕組みのオブジェクトを複数配置する場合、表示・非表示の処理を各オブジェクトのBlueprint内に持たせておけば、配置するだけでそれぞれが独立して動作します。各オブジェクトが自分専用のウィジェット参照を保持するため、近づいたオブジェクトのメッセージだけが表示されます。
一方で、画面全体に出すタイプ(Add to Viewport)の場合、複数のオブジェクトの範囲が重なっていると、メッセージが二重に表示されることがあります。同時に1つだけ表示したいときは、共通の管理役(プレイヤーやGame Instanceなど)に「今表示中のメッセージ」を1つだけ持たせ、近づいたら差し替える設計にすると重複を避けやすくなります。3D空間に出すWidget Component方式は、各オブジェクトに紐づくため、もともと重複しにくいのが利点です。
つまずきやすいポイント
| 注意したい落とし穴 |
|---|
|
よくある質問
Q. Event Tickで距離を測る方法とどちらが良いですか?
多くの場合、Overlapイベントのほうが扱いやすく処理も軽いため、まずはこちらを推奨します。Tickで距離を測る方法は、距離に応じて表示を段階的に変える(透明度を変えるなど)といった細かい制御をしたい場合に向いています。単純に「一定距離内で表示・それ以外で非表示」なら、Overlapで十分です。
Q. メッセージを「近づいたら出して、離れても少しの間だけ残す」ことはできますか?
できます。End Overlapで即座に消すのではなく、タイマー(Set Timer by Eventなど)を使って一定時間後にRemove from ParentやSet Visibilityを実行すれば、離れてから少し遅れて消す挙動になります。再び範囲に入ったらタイマーを止めて表示を維持する、といった調整も可能です。
Q. 表示するメッセージの文字を、オブジェクトごとに変えたいです。
ウィジェット側に表示用のテキスト変数を用意し、Create Widgetした直後(またはWidget Component生成後)にその変数へ各オブジェクト固有の文字列を渡せば、同じウィジェットを使い回しつつオブジェクトごとに異なるメッセージを表示できます。
まとめ
UE5でプレイヤーがオブジェクトに近づいている間だけメッセージを表示するには、オブジェクトに検知用コリジョンを付け、Begin Overlapで表示・End Overlapで非表示に切り替えるのが基本です。画面全体に出すならCreate WidgetとAdd to Viewport/Remove from Parent、オブジェクトの近くに浮かべるならWidget Componentの可視性切り替えを使い分けます。コリジョンのOverlap設定を有効にすること、消すためのウィジェット参照を保持すること、重複表示を避けることを押さえれば、目的に合った安定した表示を実装できます。なお、ノード名やオプションの位置はバージョンによって異なる場合があるため、詳細は利用中のバージョンの公式ドキュメントもあわせて確認することをおすすめします。