20.

UE5でオブジェクトに近づいている間だけメッセージを表示する方法

編集

Unreal Engine 5(UE5)でプレイヤーがオブジェクトに近づいている間だけメッセージを表示するには、対象オブジェクトに範囲検知用のコリジョン(Sphere CollisionやBox Collision)を付け、「On Component Begin Overlap」でメッセージを表示し、「On Component End Overlap」で消すのが基本です。範囲に入った瞬間に表示をOn、出た瞬間にOffへ切り替えるため、「近づいている間だけ」という条件をシンプルかつ確実に実現できます。毎フレーム距離を測る方法もありますが、Overlapイベントを使うほうが処理が軽く、表示/非表示のタイミングも管理しやすくなります。

この記事の要点
  • オブジェクト側に検知用コリジョンを追加し、Overlapイベントで表示を切り替えるのが基本形です。
  • 「On Component Begin Overlap」で表示On、「On Component End Overlap」で表示Offにします。
  • 画面全体に出すならウィジェットをAdd to Viewport、消すときはRemove from Parentを使います。
  • オブジェクトの真上などの3D空間に出したいときはWidget Componentを使い、近接時だけ可視にします。
  • コリジョンのGenerate Overlap Eventsを有効化し、消すためにウィジェット参照を保持することが重要です。
  • 複数オブジェクトを扱う場合は、表示の重複や消し忘れに注意が必要です。

仕組み: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方式は、各オブジェクトに紐づくため、もともと重複しにくいのが利点です。

つまずきやすいポイント

注意したい落とし穴
  • Overlapイベントが発生しない:コリジョンの「Generate Overlap Events」が無効だったり、プレイヤーとの衝突設定がOverlapになっていないと、Begin/End Overlapが呼ばれません。コリジョンとプレイヤーの両側の設定を確認します。
  • メッセージが消えない:表示時に生成したウィジェットの参照を保持していないと、End OverlapでRemove from Parentする対象が分からず消せません。生成したウィジェットは必ず変数に保存します。
  • 表示が重複する:範囲を出入りするたびにCreate Widgetすると、消す前に新しいウィジェットが増えていくことがあります。「すでに表示中なら作らない」などの判定を入れると安全です。
  • プレイヤー以外に反応する:判定なしだと他のアクターのOverlapでも表示されます。Cast toやタグで相手を確認してから表示すると誤動作を防げます。
  • 範囲が見た目と合わない:コリジョンの大きさ=表示が切り替わる距離です。意図した距離になるよう、Sphere RadiusやBox Extentを調整します。

よくある質問

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設定を有効にすること、消すためのウィジェット参照を保持すること、重複表示を避けることを押さえれば、目的に合った安定した表示を実装できます。なお、ノード名やオプションの位置はバージョンによって異なる場合があるため、詳細は利用中のバージョンの公式ドキュメントもあわせて確認することをおすすめします。

編集
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. ブループリントでレベル間のパラメータを受け渡す方法

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