SetInputModeUIOnlyで移動し続ける問題

お世話になります。

こちらのサイトでも触れられておりますが

Set Input Mode UI Onlyを使うと操作不能になる問題 - 妹でもわかるUnrealEngine4

読解力がないためか、うまく解決できなかったためご教授いただければと思います。

SetInputModeUIOnlyを使った際に、Overlapなどで切り替えると

axis valueが残ったままのようで移動を続けてしまう問題が解決できません…。

画像はファーストパーソンテンプレートに簡単な例を作ったものです。

よろしくお願いいたします。

こんにちは

ブログを参考に以下の方法で大雑把に作成したところ、うまくいきました。


ブログの通り、ActorクラスのデフォルトにあるBlockInputのチェックをいれます。


続いて、UMGのクラスにイベントディスパッチャーを追加して、以下のように実装しました。


最後にBeginOverlapのウィジェット作成以降を以下のように組みました。


ただ上記だと「UMGがオーバーラップに入るたびに作成して表示する」という状態になっているので非常によろしくない解決方法ではありますが、おそらくブログをみて検証をしていると思われるので、一旦これで回答させていただきます。

原理としては、ブログ先に書かれている通り、

通常のキャラクター操作を止めるために、メッセージ表示用アクターにInput関連の主導権を持たせるように設定

BlockInputを使って全イベントを遮断

押してたキーから指をはなしたっていう情報がUE4に上手く伝わってない気配がある。

UIOnlyじゃなくて、SetInputModeGameAndUIを使うようにした

が目的のため、

1.キャラクター操作を止めるために、別のActorにInputイベント関連の主導を持たせる

2.他のアクター(Charactorクラス、Pawnクラス等)にInputイベントが実行されないように、1のActorでInputイベントを遮断して止める

3.Set Input UI OnlyでUIのみの入力受付にしても、内部的には止めた時点でのInputAxisがボタンから指を離しても0にならないまま値を持ち続けてしまうため、SetInputModeGameAndUIでInputAxisの値を更新できるようにする。

4.Inputイベントがまず主導権を握っている1のActorに来るため、ActorがInputAxisを受け取っていてもBlock Inputが有効になっている以上、他のActorにInputイベントが行かない(そのため操作キャラクターが動かなくなる)

というのをやっているのかな、と思います。(間違ってたらスミマセン!)

何か疑問があれば、わかる範囲でお答えいたします。

Ogino様、ご教授の方ありがとうございます!

素晴らしく丁寧に解説してくださり、大変恐縮です。

おかげさまで、教えていただいた通りに組んだところ

無事にインプットの暴走を止めることはできました!…が、

教えていただいているところの「主導権」の部分が

まだよく仕組みを理解できておりません。

先に来ている「Enable Input」のGetPlayerControllerも、最後の「Disenable Input」の

GetPlayerControllerも同じコントローラ(デフォルトで言うところのPlayerController)ではない?

「Enable Input」のターゲットがSelfになっていると、そのBPのActorに主導権が移るということでしょうか?

その場合、現在の主導権を確認する方法はあるのでしょうか?

Possessとは違うのでしょうか…。

疑問点を並べてしまってすみません。

解決できてよかったです!疑問点をわかる範囲でお答えいたします。


先に来ている「Enable Input」のGetPlayerControllerも、最後の「Disenable Input」の
GetPlayerControllerも同じコントローラ(デフォルトで言うところのPlayerController)ではない?

両方ともGetPlayerControllerのPlayerIndexに0を指定しているので、同じものが取れています。


「Enable Input」のターゲットがSelfになっていると、そのBPのActorに主導権が移るということでしょうか?

その場合、現在の主導権を確認する方法はあるのでしょうか?

正確に言えば、そのActorクラスにキーボードの「Q」やゲームパッドの「Aボタン」のようなInputイベントが取得できるようにするために「Enable Input」を使用します。

Enable Inputの日本語訳コメントを読んだところ、「入力処理のスタックにこのアクターをプッシュする」と書かれているので、後に入れた順でインプットイベント処理を流すようになっています。

この場合、EnableInputで後に入れたActorクラスがまずInputイベントを処理後、ゲーム起動時にエンジン側でプッシュされたファーストパーソンのキャラクタークラスにInputイベントが渡されます。

この場合、先にインプットイベントを処理するActorクラスで「Block Input」が有効になっているため、先にエンジン側でプッシュされたファーストパーソンのキャラクタークラスにInputイベントが渡らない、という実装になっています。

おそらくですが、Enable Inputによって最初にインプットイベントをActorが受け取れるようになっているため、「主導権を持つ」という書き方になっていると思われます。

軽く調べたところ、インプットイベントを受け取れるアクター一覧を取得するクラスが見当たらないため、Blueprintでは取れない、かもしれません。(もしかしたら見落としているかもしれないので、該当のクラスがあれば別途記載します。)

以下、Enable Inputのドキュメントになります。

https://api.unrealengine.com/JPN/Gameplay/HowTo/ActorInput/Blueprints/index.html


Possessとは違うのでしょうか…。

完全に別物です。

Possessは、簡単に説明すると「Pawnクラス、Characterクラスの入力制御を別のPawn,Characterクラスに移すクラス」です。

Enable Inputは、そのActoerで「Inputイベントを受け取れる」ようにするクラスになります。

以下、ドキュメントになります。

https://api.unrealengine.com/JPN/Gameplay/HowTo/PossessPawns/Blueprints/index.html

再度ご回答の方ありがとうございます!

Block Inputの部分など、滅茶苦茶わかりやすいです。

添付していただいたドキュメントと合わせて読んで、理解、納得することができました。

(単純にキー入力を停止/再開させるノードだと思っておりました…)

とても勉強になりました。ありがとうございました。