62.

UE5で画面にメッセージを一定時間表示して消す方法|DelayとTimer

編集

Unreal Engine 5(UE5)で画面にメッセージを一定時間だけ表示して自動的に消すには、Widget Blueprintで作ったメッセージUIをAdd to Viewportで表示し、DelayまたはSet Timer by Eventで待機させた後、Remove from Parentでビューポートから取り除くのが基本です。この記事では、その基本構成から、タイマーで管理する方法、フェードアウトで消す方法、デバッグ用のPrint Stringまでを順に解説します。

この記事の要点
  • 基本の流れは「Create WidgetAdd to Viewport → 一定時間待つ → Remove from Parent」の4ステップ。
  • 待機にはノードを直列につなぐDelayと、イベントを後から呼ぶSet Timer by Eventの2通りがある。タイマーは途中キャンセルや再設定がしやすい。
  • 消し方は「即座に消す(Remove from Parent)」と「フェードアウトしてから消す(アニメーション+完了後にRemove)」が選べる。
  • UI不要のデバッグ目的ならPrint StringのDuration(秒)指定が手軽。ただし製品の演出用UIには向かない。
  • 連続表示時の重複・参照の保持・Delayの再入には注意が必要(後述の落とし穴を参照)。

基本の考え方

画面上のメッセージは、多くの場合Widget Blueprint(UMGのウィジェット)として作成します。これを実行時にインスタンス化してビューポートへ追加すると画面に表示され、ビューポートから取り除くと消えます。「一定時間だけ表示する」とは、表示してから取り除くまでの間に待機を挟むということです。

全体の流れは次の4ステップに整理できます。

  1. Create Widget:メッセージ用Widget Blueprintのインスタンスを生成する。
  2. Add to Viewport:生成したウィジェットを画面に表示する。
  3. 待機:DelaySet Timer by Eventで指定秒数だけ待つ。
  4. Remove from Parent:ウィジェットをビューポートから取り除いて消す。

このうち、待機の方法と消し方の組み合わせによって、いくつかの実装パターンが生まれます。以降で順に見ていきます。

1. Delayノードで表示して消す(最も基本)

まずはメッセージを表示するWidget Blueprintを用意します。コンテンツブラウザで右クリックし、ユーザーインターフェイスからWidget Blueprintを作成して、デザイナーにText(またはRich Text Block)を配置します。表示文言は固定でもよいですが、後から差し替えたい場合はテキストを公開変数(Is Variable)にしておくと、生成時にBlueprintから設定できます。

次に、表示を呼び出したい側のBlueprint(レベルBlueprintやプレイヤー側のActor/Controllerなど)で、以下のようにノードをつなぎます。

[任意のイベント]

 └ Create Widget(Class=メッセージWidget)→ Return Value を変数(例:MsgWidget)に保存

 └ Add to Viewport(Target=MsgWidget)

 └ Delay(Duration=3.0 など秒数を指定)

 └ Remove from Parent(Target=MsgWidget)

この構成では、ウィジェットを表示したあとDelayで指定秒数だけ待機し、待機が明けたらRemove from Parentで取り除きます。DelayのDurationに表示したい秒数(例:3秒)を入れるだけで、表示時間を調整できます。

呼び出すイベントは、ゲーム開始時に出すならEvent BeginPlay、特定の操作やトリガーで出すなら入力イベントやオーバーラップイベントなど、目的に応じて選びます。

2. Set Timer by Eventで管理する方法

Delayはノードを直線的につなぐぶん分かりやすい一方、待機中に外部からキャンセルしたり、表示時間を後から変えたりするのは不得手です。こうした制御をしたい場合はSet Timer by Eventが向いています。

Set Timer by Eventは、「指定した秒数(Time)が経過したら、つないだイベントを呼ぶ」ノードです。戻り値のTimer Handleを保持しておけば、Clear and Invalidate Timer by Handleで途中キャンセルできます。基本形は次のとおりです。

[表示イベント]

 └ Create Widget → 変数 MsgWidget に保存

 └ Add to Viewport

 └ Set Timer by Event(Event=HideMessage, Time=3.0, Looping=オフ)→ Return Value を変数 HideTimer に保存

 

[カスタムイベント:HideMessage]

 └ Is Valid(MsgWidget)が真なら Remove from Parent

このパターンの利点は、表示中に再度同じメッセージを出したいときに、HideTimerをいったんClearしてからSet Timer by Eventを呼び直すことで、表示時間をリセットできる点です。トースト通知のように「新しい通知が来たら表示時間を延長する」といった挙動を実装しやすくなります。なお、待機をLooping=オフ(既定)にしておくと、一度だけ呼ばれて自動終了します。Loopingをオンにする場合は、不要になった時点で必ずタイマーをClearしてください。

3. フェードアウトしてから消す(アニメーション)

パッと消えると唐突に感じられることがあります。徐々に薄くなって消える演出にするには、UMGのアニメーション(Animation)を使います。手順の概要は次のとおりです。

  1. Widget BlueprintのデザイナーでAnimationsパネルから新規アニメーションを作成する。
  2. タイムラインでテキストやルートのRender Opacity(不透明度)を、1.0から0.0へ変化させるキーを打つ。必要なら表示時の0.0→1.0(フェードイン)も付ける。
  3. Graph側でPlay Animation(またはPlay Animation by Name)を呼んでフェードアウトを再生する。
  4. アニメーション終了に合わせてRemove from Parentを呼ぶ。終了タイミングはOn Animation Finishedイベントをバインドするか、アニメーション長と同じ秒数のDelay/タイマーで合わせる。

「一定時間そのまま表示 → フェードアウト → 消える」という流れにする場合は、表示 → 待機(Delay/Timer)→ Play Animation(フェードアウト)→ 終了後にRemove from Parentとつなぎます。アニメーションの長さと待機秒数は別物なので、合計の表示時間=「待機秒数+アニメーション長」になる点に注意してください。

4. デバッグ用なら Print String が手軽

開発中の確認や、簡単なログ表示だけでよい場合は、Widgetを作らずにPrint Stringノードで画面にテキストを出せます。Print StringにはDuration(表示秒数)の入力があり、ここに秒数を指定すると、その時間が過ぎると自動的に消えます。Durationは既定でおおむね2秒程度に設定されています(バージョンにより異なる場合があるため、ノードの既定値を確認してください)。

Print String

 In String = "メッセージ"

 Duration = 5.0(秒)

 Print to Screen = true

ただしPrint Stringは画面左上にデバッグ表示されるもので、フォントや配置を細かく整えられず、パッケージ化したビルドでは既定で表示されない設定になっていることもあります。製品としてプレイヤーに見せる演出には、Widget Blueprintを使う方法を推奨します。Print Stringはあくまでデバッグ・確認用と位置づけるのが無難です。

落とし穴と注意点

つまずきやすいポイント
  • 連続表示で重複する:消える前に再度Create Widget+Add to Viewportを呼ぶと、メッセージが何枚も重なって表示されることがあります。既存ウィジェットがあるか変数で管理し、表示済みなら作り直さず再利用するか、先に取り除いてから出す設計にします。
  • 参照を保持しないとRemoveできない:Create Widgetの戻り値を変数に保存しておかないと、後からそのウィジェットを取り除けません。Remove対象を確実に参照できるよう、生成時に変数へ保存しておきます。
  • Delayの再入:同じBlueprintで同一のDelayノードがまだ待機中に、もう一度その経路を通すと、待機がリセットされて意図しない挙動になることがあります。連打や高頻度トリガーが想定される場合は、DelayよりSet Timer by Eventでハンドル管理する方が安全です。
  • タイマーとウィジェットの寿命:ウィジェット自身の中でLoopingのタイマーを動かしたままRemove from Parentすると、タイマーが残って正しく破棄されず、繰り返すうちに負荷が増える場合があります。取り除く前にタイマーをClearするか、寿命の管理を外側のActorに持たせる構成を検討してください。
  • 待機後の有効性チェック:待機している間にレベル遷移などでウィジェットが無効になることがあります。Remove from Parentの前にIs Validで確認すると、無効な参照へのアクセスを避けられます。

方法の使い分け

方法向いている用途途中キャンセル
Delay+Remove from Parent一度きりの単純な表示しにくい
Set Timer by Event再表示・延長・キャンセルが要る場合しやすい(Handle管理)
アニメーション(フェード)滑らかに消す演出条件次第
Print Stringデバッグ・動作確認不可(Duration固定)

よくある質問

Q. 表示時間(秒数)はどこで変えますか?

Delayを使う場合はDuration、Set Timer by Eventを使う場合はTime、Print Stringの場合はDurationの値を変更します。いずれも単位は秒です。変数につないでおけば、難易度や状況に応じて実行時に表示時間を切り替えることもできます。

Q. メッセージが消えずに残ってしまいます。

多くは、Remove from Parentの対象ウィジェットを正しく参照できていないか、待機が完了する前に別の処理へ分岐しているケースです。Create Widgetの戻り値を変数に保存しているか、待機ノードの実行ピンがRemove from Parentまで確実につながっているかを確認してください。タイマー方式の場合は、Clearし忘れで二重に走っていないかも見直すとよいでしょう。

Q. パッケージ化したビルドでPrint Stringのメッセージが出ません。

Print Stringはデバッグ向けの機能で、製品ビルドでは表示されない設定になっていることがあります。プレイヤーに必ず見せたいメッセージは、Widget Blueprintで作る方法に置き換えてください。

まとめ

UE5で画面にメッセージを一定時間だけ表示して消す基本は、「Widgetを表示 → 待機 → 取り除く」の流れです。単純な一回表示ならDelay、再表示やキャンセルが必要ならSet Timer by Event、滑らかに消したいならフェードアウトのアニメーション、開発中の確認だけならPrint Stringと、目的に合わせて使い分けるのがポイントです。連続表示時の重複や参照の保持といった落とし穴に注意しながら、見やすく扱いやすいメッセージ表示を組み立ててみてください。

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

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