ボタンのイベントを制御したい。
※以下、個人的な方法です。
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
InKeyEvent->GetKeyを調べて、Shiftが入力されていた場合、グローバルなどこかにフラグを持たせてオンにします。その後、Unhandledを返せば、Shift+Tabで、Shiftが先に押された場合、TabをOnKeyDownで再び処理しようとするので、そこでTabが入力されているか、グローバルなShiftフラグのチェックをして、フォーカス移動処理を行います。
キーが離された時に、グローバルなフラグのチェックを外します。
まだまだ分からない事が多いので、作っては直しの繰り返しです。