イベントでHandledを返して標準操作を無効化する
「昨日の、フォーカス移動を自前のキー処理でやってても、カーソルキーとかでも動かせちゃう問題だけど、こういう風にすると対応出来る」
「昨日のブループリントだと、A・S・Dの3つのキーのどれでもないキーが押された時、最後のブランチノードがFalseだった時に、何もしてなかった。これだと多分ReturnValueが初期値のままで、EventRelpyの場合だとUnhandledをセットした場合と同じ動作になってると思う。そこを変更して、対応してないキーを押した場合はHandledを返すようにする。こうするとカーソルキーとかEnterキーとかの操作が無視される」
妹「どういう理屈でそんなことになったんだろ? UnhandledとHandledって何が違うの?」
「英語資料ばっかりだから自信ないんだけど、まずOnPreviewKeyDownもOnKeyDownも、システム標準のものより先に、こっちで作ったブループリントが実行される。で、ブループリントの結果がUnhandledだったら何もしないでシステムにお任せという意味になる。Handledだったらブループリントの方で済ませたからシステム側では何もしないで下さいという意味になる」
妹「イベント応答のとこにはHandledでもUnhandledでもないやつってあるよね? SetUserFocusもだけど。それだとどうなるの?」
「そういうノードにはEventReplyの入力ピンがあるから、そこでどっちなのか設定する。つまりHandled設定+フォーカス設定なのか、フォーカス設定だけでUnhandledなのか。別のEventReplyをくっつけることも出来るけど、ずっとたどっていけばどこかでHandledかUnhandledか設定されてる。そうでないとコンパイル出来ない。今回妹が作ったのだとSetUserFocusにHandledがつながってるから、Handledになってる」
妹「そうなんだ……ネットで見たとおりに作っただけだから意味は知らないけど。でもブループリントでなんかやってるってことは、結局何かするってことでしょ? いちいち設定しなくても全部Handledでいいんじゃないの?」
「ブランチの結果次第では何もしないで終わるというパターンもあるから。何を押したかPrintStringで表示するだけだったらUnhandledの方がいいし。部分的に標準操作を残したい場合もある。今回の場合でも、カーソルキーの時だけHandledにして、EnterキーはUnhandledという風にも出来るから」
妹「ゲームパッドのボタンはどうなるの? あれも標準で動かせるやつなかったっけ?」
「ゲームパッドもKeyDownイベントで、キーボードと同じ扱いになってるから、Unhandledならそのままだし、Handledにすれば効かなくなるよ。もちろんキーと同じように別の動きも設定も出来る。LとRで左右に動かしたりとか」