Set Input Mode UI Onlyを使うと操作不能になる問題
「昨日発生した、ウィジェットを表示した時に、その時進んでた方法に進み続けてしまう問題を調査した」
「これがTPSテンプレートのデフォルトキャラ(グレーマン)のブループリント。このInputAxisのところに数字が入り続けて、このイベント自体も実行させるから、結果的に前に進み続けてたらしい」
妹「じゃあここに、ウィジェットを出してるかどうか判断するBranchノードとかを」
「それでもいいんだけど、ボタンとかいっぱいある場合にいちいち設定するのがめんどくさい。なので今回はちょっと違う方法を採用した」
「まず通常のキャラクター操作を止めるために、メッセージ表示用アクターにInput関連の主導権を持たせるように設定する。これで他のInputAxisとかは全部無効化できる。同じ種類のイベントがある場合に、こっちを優先とかもあるんだけど、今回はBlockInputを使って全イベントを遮断してしまう。この設定だけで、とりあえずメッセージ表示中には暴走しなくなった。でもメッセージが消えると暴走した」
妹「なぜ……」
「TPSキャラクターはいわゆるWASDキーで動いてるんだけど、全身のWキーを押して、その後メッセージ表示中にWキーをはなしてるわけだけど、この押してたキーから指をはなしたっていう情報がUE4に上手く伝わってない気配がある。何も言ってこないから押したままなんだろうって。なのでUIOnlyじゃなくて、SetInputModeGameAndUIを使うようにした」
妹「そうすると押してないのわかるの?」
「ウィジェット側の操作もできるけど、ゲーム側のキー操作は無効になってないからね。BlockInputの仕掛けと組み合わせると、操作できないけど入力データそのものは内部処理できてる状態になった。これで何とか想定している動作になった。4.18でも変わってない」
妹「これ他に困ってた人いないのかな」
「探した範囲では見つからなかったけど、InputAxisで移動中でウィジェットが表示される、しかもウィジェット側が操作を独占するという事態が、あまりないのかも。会話ボタン押して表示とかだったら実害はなかっただろうし」