4.

UE5で画像クリックでウィジェットを閉じる方法|ButtonとOn Mouse Button Down

編集

Unreal Engine 5(UE5)のUMGで「画像(Image)をクリックしたらそのウィジェットを閉じたい」場合は、Imageを「Button」の中に入れ、ButtonのOn Clickedイベントで閉じる処理(Remove from Parent など)を呼ぶ方法が最も確実です。Imageウィジェットはボタンのようなクリックイベントを直接持たないため、クリックを受け取れるButtonに包むか、On Mouse Button Down(マウス押下)をオーバーライドする形でクリックを拾う必要があります。この記事では、推奨される方法と代替手段、閉じる処理の書き方、つまずきやすいポイントまでを順に解説します。

この記事の要点
  • UMGのImage(画像)ウィジェットは、Buttonのような「On Clicked(クリック)」イベントを標準では持たないため、画像単体に「クリックで閉じる」を直接付けることはできません。
  • 方法①(推奨):ImageをButtonの中に入れ、ButtonのOn Clickedイベントから閉じる処理を呼ぶ。最も簡単で誤動作が少ない方法です。
  • 方法②:On Mouse Button Down(マウスボタン押下)をオーバーライドして、Image(または親ウィジェット)自体でクリックを拾う。Visibilityの設定など条件があります。
  • 閉じる処理はRemove from Parentが基本。状況に応じて、入力モードやマウスカーソルの表示を元に戻す処理も併せて行います。
  • うまく動かない多くの原因は、ImageのVisibilityが入力を受け取らない設定になっている、または画像単体にイベントを期待していることにあります。

1. なぜImageだけでは「クリックで閉じる」が作れないのか

UMGのウィジェットには、ユーザー操作に応じてイベントを発火するものと、そうでないものがあります。Buttonは「On Clicked」「On Pressed」「On Released」「On Hovered」といったクリック関連のイベントを公式に備えており、デザイナー上でウィジェットを選択すると、詳細パネルのイベント欄からこれらのイベントノードを簡単に追加できます。

一方でImageは、見た目(画像表示)を担当するウィジェットであり、Buttonのような「On Clicked」イベントを標準のイベント欄には持ちません。そのため、「Imageを選択して On Clicked を探す」というアプローチでは、目的のイベントが見つからないことになります。

クリックを画像で受け取りたい場合の考え方は、大きく2つに分かれます。

方法①:Buttonで包む(推奨)Imageを透明(または装飾なし)のButtonの子にして、ButtonのOn Clickedで閉じる。実装が単純でホバー演出も使える。
方法②:On Mouse Button Downを使うマウス押下イベント(OnMouseButtonDown)をオーバーライドし、押下座標や対象に応じて閉じる。Image自体のクリックを拾えるが設定条件がある。

多くのケースでは、方法①が手軽で安定します。まずは方法①から見ていきましょう。

2. 方法①:ImageをButtonの中に入れてクリックで閉じる(推奨)

「×ボタン」のように、画像をクリックの当たり判定ごとButtonに任せる方法です。Buttonがクリックを受け取り、その中の画像が見た目を担当します。

2-1. ウィジェットの構成

ウィジェットブループリント上で、次のような階層を組みます。

Canvas Panel

 └ Button(クリックを受け取る)

     └ Image(×印などの画像を表示)

手順は次のとおりです。

1. ウィジェットブループリントのデザイナーで、パレットからButtonを配置する。

2. そのButtonの子としてImageをドラッグして入れる。

3. Imageの「Brush」プロパティに表示したい画像(テクスチャ)を設定する。

4. Buttonの見た目を画像だけに見せたい場合は、Buttonの「Style」にある各状態(Normal / Hovered / Pressed)の背景を透明に近い設定にする。これにより、ユーザーには画像だけが見え、クリック判定はButtonが担当します。

2-2. On Clickedで閉じる処理をつなぐ

Buttonを選択した状態で、詳細パネル下部のイベント欄から「On Clicked」の+を押すと、グラフにOn Clickedイベントノードが追加されます。あとは、このイベントから閉じる処理(次章の「3. ウィジェットを閉じる処理」)へつなぐだけです。

この方法のメリットは、クリック判定・ホバー演出・押下フィードバックといったボタンの機能をそのまま利用でき、追加のオーバーライドが不要なことです。一般的な「×ボタン」「閉じるボタン」はこの構成で十分実現できます。

3. 方法②:On Mouse Button DownでImage自体のクリックを拾う

Buttonで包まず、Image(あるいはそのImageを含むウィジェット)自体でマウスのクリックを直接受け取りたい場合は、On Mouse Button Down(マウスボタン押下イベント)のオーバーライドを使います。これはウィジェットがマウス押下を検知したときに呼ばれる関数で、戻り値として「このイベントを処理したかどうか(Handled / Unhandled)」を返す仕組みになっています。

3-1. クリックを受け取るための前提条件

マウス押下イベントを拾うには、対象のウィジェットが入力(ヒットテスト)を受け取れる状態である必要があります。ここがうまくいかない最大の原因になりやすいので、次の点を確認します。

VisibilityImageのVisibilityを「Visible」にする。「Self Hit Test Invisible」「Hit Test Invisible」などヒットテストを無効化する設定では、マウス入力を受け取りません。
イベントの取得場所On Mouse Button Downは、ウィジェットの「関数のオーバーライド」として実装します(グラフ画面のOverride(または関数追加)メニューから選択)。Imageの詳細パネルに、Buttonと同じ並びのイベント欄として用意されているわけではない点に注意します。
戻り値このイベントは戻り値を返します。クリックを「処理した」とみなして他へ伝播させたくない場合は、Handled(処理済み)を表す返り値を接続します。

「クリックしたImageだけ」を確実に判定したい場合の実装しやすい構成は、そのImageを単独の子ウィジェット(ユーザーウィジェット)として切り出し、その子ウィジェット側でOn Mouse Button Downをオーバーライドする形です。これにより、押下を受け取ったのがそのImage領域であることが明確になります。

3-2. 実装の流れ

1. クリック対象にしたいImage(またはそれを含むウィジェット)のVisibilityを「Visible」に設定する。

2. グラフ画面で「On Mouse Button Down」をオーバーライド(関数として追加)する。

3. そのイベントから閉じる処理(Remove from Parentなど)へつなぐ。

4. 必要に応じて、イベントの戻り値にHandledを返し、クリックがこのウィジェットで処理されたことを伝える。

なお、左クリックだけを対象にしたい場合は、押下イベントが渡してくる入力情報(押されたボタンの種類)を確認して分岐させると、誤動作を防げます。

4. ウィジェットを閉じる処理

クリックを受け取った後の「閉じる」処理は、方法①・方法②で共通です。基本はRemove from Parentを使います。

(On Clicked / On Mouse Button Down)

    ↓

Get(閉じたいウィジェットの参照)

    ↓

Remove from Parent

閉じる対象が「自分自身のウィジェット」であれば、グラフ内でその対象を参照してRemove from Parentを呼びます。ボタンや画像はあくまでウィジェット内の部品なので、閉じたいのは部品ではなく、それを含むウィジェット全体である点を意識してください。

4-1. 入力モードやカーソルを元に戻す

ポップアップやメニューを開くときに、入力モード(UI操作向けのモード)への切り替えやマウスカーソルの表示を行っていた場合は、閉じるタイミングで元の状態に戻す処理も忘れずに行います。たとえば、ゲーム操作に戻す入力モードへ切り替えたり、ゲーム中はカーソルを非表示に戻したりといった調整です。これを行わないと、ウィジェットを閉じてもUI操作モードのままになり、ゲーム側の操作が効かない、といった違和感につながります。

5. 具体例:×(バツ)ボタン画像でポップアップを閉じる

ここまでの内容を、よくある「ポップアップ右上の×ボタン」を例にまとめます。方法①(推奨)の構成です。

1. ポップアップ用のウィジェットブループリントを用意する。

2. 右上にButtonを配置し、その子に×印のImageを入れる。

3. Buttonの各状態(Normal / Hovered / Pressed)の背景を透明寄りにして、見た目を×画像だけにする。

4. ButtonのOn Clickedイベントを追加する。

5. On Clickedから、このポップアップウィジェット自身を対象にRemove from Parentを呼ぶ。

6. 必要なら、同じ流れの中で入力モードやカーソルの状態を元に戻す。

これで、×画像をクリックするとポップアップが閉じる挙動になります。ホバー時に×の色を変えるなどの演出も、ButtonのStyleで簡単に追加できます。

6. つまずきやすいポイント(落とし穴)

注意したい点
  • Image単体にクリックイベントを期待してしまう:ImageはButtonのようなOn Clickedを標準で持ちません。クリックで動かしたいなら、Buttonで包む(方法①)か、On Mouse Button Downをオーバーライドする(方法②)必要があります。
  • Visibilityが入力を受け取らない設定になっている:方法②でクリックが反応しないときは、まずImage(または対象ウィジェット)のVisibilityが「Visible」かを確認します。「Self Hit Test Invisible」などではマウス押下を受け取りません。
  • 透明なButtonでも当たり判定はある:方法①でButtonの背景を透明にしても、Button自体のクリック判定は残ります。逆に、見えないButtonが他の操作を遮らないよう、サイズと配置には注意します。
  • 閉じる対象を取り違える:Remove from Parentで閉じるべきは、ボタンや画像という部品ではなく、それらを含むウィジェット全体です。対象の参照を取り違えると、意図したものが閉じません。
  • 入力モード・カーソルの戻し忘れ:開くときにUI向けの入力モードやカーソル表示を変更していた場合、閉じる際に元へ戻さないと操作不能のような状態に見えることがあります。

7. よくある質問(FAQ)

Q1. Buttonで包む方法と、On Mouse Button Downを使う方法はどちらが良いですか?

一般的な「クリックで閉じる」用途であれば、Buttonで包む方法①が手軽で安定します。On Clickedイベントがそのまま使え、ホバーや押下の演出も得られるためです。On Mouse Button Down(方法②)は、Buttonを使わずにImage領域で直接マウス押下を判定したい、押下と離しを細かく区別したい、といった事情があるときに選ぶとよいでしょう。

Q2. 画像をクリックしても何も起きません。何を確認すればよいですか?

方法②(On Mouse Button Down)の場合は、対象ウィジェットのVisibilityが「Visible」になっているかを最初に確認してください。ヒットテストを無効化する設定だとマウス入力を受け取りません。方法①(Button)の場合は、Imageが本当にButtonの子になっているか、On Clickedイベントが正しく閉じる処理につながっているか、別のウィジェットがButtonの上に重なってクリックを遮っていないかを順に確認します。

Q3. 閉じたウィジェットをあとでまた表示したい場合はどうすればよいですか?

Remove from Parentは表示ツリーから取り外す操作です。同じウィジェットを再表示したい運用では、毎回作り直して表示する方法と、取り外しの代わりにVisibilityで表示・非表示を切り替える方法があります。再表示の頻度が高いUIでは、削除ではなく表示状態の切り替えで管理すると扱いやすくなります。用途に応じて、どちらの方針にするかを決めてください。

8. まとめ

UE5のUMGで「画像をクリックしたらウィジェットを閉じる」を実現するポイントは、Imageがクリックイベントを直接持たないことを前提に、クリックを受け取れる仕組みを用意することです。最も簡単で確実なのは、ImageをButtonの中に入れてOn Clickedで閉じる方法①です。Buttonを使わずにImage領域で直接マウス押下を拾いたい場合は、On Mouse Button DownのオーバーライドとVisibility「Visible」を組み合わせる方法②が選択肢になります。閉じる処理はRemove from Parentを基本に、必要に応じて入力モードやカーソルの状態を元に戻すところまで含めて作ると、違和感のない閉じる動作になります。表示・操作仕様はUEのバージョンや設定によって挙動が異なる場合があるため、最終的な確認は実機(エディタでのプレイ)で行うことをおすすめします。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ブループリントでWidgetに引数を追加する方法
  2. Blueprintで特定のクラスのWidgetを閉じる方法
  3. Widgetの前後関係を設定する方法
  4. ウィジェットの画像を選択するとウィジェットを閉じる方法
  5. マウスを動かせるUIを作成する方法
  6. ウィジェットのボタンに文字を書く方法
  7. BPでウィジェットのボタンを選択できなくする方法
  8. ウィジェットの背景ブラーについて
  9. リストビュー (ListView)
  10. EntryWidgetClass
  11. ウィジェットで一部の領域を部品化して再利用する方法

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