1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

UE4でフォーカス制御可能なボタンを作る

Posted at

ボタンのイベントを制御したい。

※以下、個人的な方法です。

UnrealEngine4を触り始めた時はImageを使ったりしていましたが、
ReleaseとかHoverとかフォーカスの事を考えたりすると、ボタンでイベント制御しないといけないという思いに至りました。

まずボタンのサブクラス(BP)を作成する。

プロジェクト用にカスタマイズされたボタンを作成します。
プロジェクトに依存する必要な機能をそこに記載します。
移行する可能性のある汎用的なボタンを作るなら、
Button->汎用ボタンBP->プロジェクトボタンBP
という感じで作成します。

ボタンのラッパーUserWidgetを作成する。

このラッパーUserWidgetをラッパーボタンとでもします。
参考にした記事:

ラッパーボタンにCanvasPanelがあれば、削除してボタンウィジェットを配置します。
動的に作成する場合は、変数にボタンクラスをスポーン変数として設定し、PreConstructで作成するとかでしょうか?(未確認なので、分かりませんが)
このラッパーボタンをボタンの代わりに使用します。

中身のボタンのIsFocusableを外して、このラッパーUserWidgetのIsFocusableをオンにして、フォーカスがこのラッパーボタンに向くようにします。

イベント処理

OnAddedToFocusPath
OnRemovedFromFocusPath
・フォーカスが当たった時、外れた時に処理を行う。ここでUIの外観の変更や他オブジェクトへの通知をするなど考えられます。

中身のボタンのOnClicked、OnPressedなどを、ラッパーボタンに同等のOnClickedなどを作っておき、そのまま流します。もちろんイベントディスパッチャーに通知するとか何か処理してもOKですが。
ラッパーボタンを作成する事でプロジェクト内のボタンを共通化でき、変更に対して柔軟になります。

キー処理

以下はShiftを伴うキー処理をしています。
例えば、Shift+Tabでフォーカスを1つ戻す挙動を制御する場合です。

OnKeyDown

shift1.png

InKeyEvent->GetKeyを調べて、Shiftが入力されていた場合、グローバルなどこかにフラグを持たせてオンにします。その後、Unhandledを返せば、Shift+Tabで、Shiftが先に押された場合、TabをOnKeyDownで再び処理しようとするので、そこでTabが入力されているか、グローバルなShiftフラグのチェックをして、フォーカス移動処理を行います。

shift2.png

キーが離された時に、グローバルなフラグのチェックを外します。

まだまだ分からない事が多いので、作っては直しの繰り返しです。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?