ボタンの同時押しでUEnhancedInputComponent::BindAction()に渡した関数を実行したい

お世話になっております。

<br/>

ゲームコントローラーの2つのボタン(X, Y)の同時押しでUEnhancedInputComponent::BindAction()のFuncに渡したデリゲートを実行させようとしています。

<br/>

UInputAction(IA)はアセットではなく、ランタイムで生成しておりまして、X,YのIAを作成、それぞれをキーとマッピングしています。

また、UInputTriggerChordAction(IT)のChordActionにYのIAを設定し、同ITをXのIAのTriggersに追加しています。

<br/>

はじめに、BindAction()のTriggerEventにETriggerEvent::Startedを渡したところ、Xを押すだけでデリゲートが実行されてしまいました。

Xを押すだけで、None -> Ongoing の状態になるようです。

<br/>

そこで、ETriggerEvent::Triggeredを渡すようにしたところ、X,Y同時押しでデリゲートが実行されることを確認できました。

<br/>

ただ、ETriggerEvent::Triggered は Triggered -> Triggered のときにも(ボタンを同時押ししている間は繰り返し)実行されるため、デリゲートを単発実行したい場合には適切でないように思いました。

<br/>

ボタン同時押しでデリゲートを1度だけ実行させたい場合に適切な方法は何でしょうか?

<br/>

以上、よろしくお願い致します。

お世話になっております。

> はじめに、BindAction()のTriggerEventにETriggerEvent::Startedを渡したところ、Xを押すだけでデリゲートが実行されてしまいました。

> Xを押すだけで、None -> Ongoing の状態になるようです。

以下の手順でテストを行ったところ、こちらでは再現が取れませんでしたので、ランタイムでInput Actionを生成する手順に問題があるのかもしれません。C++版Third Personテンプレートなどを利用して、簡易な再現プロジェクトをご提供いただくことは可能でしょうか。

  1. C++版Third Personテンプレートでプロジェクトを作成
  2. Input Action 「IA_Shift」をbool値で作成
  3. Input Mapping Context「IMC_Default」を開いて、IA_Shiftを追加して、左Shiftキーをマッピング
  4. JumpのスペースバーにChorded Actionを追加し、「IA_Shift」を指定

C++版Third Personテンプレートは、ETriggerState::StartedにBindActionを行っており、

EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump); EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);ご報告いただいたものと同じ症状が起こるのであれば、左Shiftキーを押しただけでキャラクターがStartedを受け取ってジャンプするはずなのですが、そのような挙動は見られず、本来の仕様通りに動作するという結果となりました。

> ボタン同時押しでデリゲートを1度だけ実行させたい場合に適切な方法は何でしょうか?

本来はETriggerEvent::Startedで取れるはずですが、うまくいかないとなりますと、もう一つの方法としてXとYの両方のInputActionのトリガーに「Pressed(UInputTriggerPressedクラス)」を追加するということが考えられます。この設定を行えば、ボタン同時押し続けによるETriggerEvent::Triggeredの連続実行が防げるようになるはずです。

以上、よろしくお願いいたします。

ご回答ありがとうございます。

C++版Third Personテンプレートでご教示いただいた手順で確認すると、私の認識では Space + 左Shift でジャンプするのを期待したのですが、変わらず Space だけでジャンプしていました。

これは、先に述べた「Xを押すだけでデリゲートが実行」と同様の状態(X=IA_Jump:Space, Y=IA_Shift:左Shift)だと思ったのですが、ETriggerEvent::Started で Space 単体ではジャンプさせず、Space + 左Shift でのみジャンプさせることはできるでしょうか?

UInputTriggerPressedを利用することでデリゲートが連続実行されないことを確認できました。

ただ、操作性の点でボタン同時押しでデリゲートを実行しにくいように感じましたので、こちらはどうするか検討したいと思います。

以上、よろしくお願い致します。

ご確認ありがとうございました。

先日の時点で、プロジェクトをお渡ししておくべきでした。大変申し訳ありません。

本投稿に添付しておりますので、解凍の上、ヴァニラエンジン(ランチャー版エンジン)の5.3.3でプロジェクトを開いてPIEを実行し、Shiftを押した時点でジャンプが行われてしまう(「Xを押すだけでデリゲートが実行」相当の挙動)かどうか、いま一度ご確認いただけますでしょうか。PIEをスタートさせると、Enhanced Inputのデバッグ表示が行われるようにしてあります。

当方で確認をとる限りでは、下図のとおり、Shiftキーを押すだけではIA_Jumpアクションはトリガーされない(「Xを押すだけではデリゲートは実行されない」にあたる)という動作が確認されています。また、この再現プロジェクトの設定では、 Space + 左Shift でのみジャンプさせることが可能となっております。

[Image Removed]

以上、よろしくお願いいたします。

プロジェクトを添付していただき、ありがとうございます。

違いがわかりました。

IMC_DefaultでIA_Jumpに対して複数のキー(Spaceキー, …)がバインドされているとSpaceキーだけで Jump が実行されてしまうようです。

ご教示いただいた手順を確認した場合に、デフォルトのゲームパッドとタッチのキーバインドを残していたため同時押しでジャンプできなかったという状況でした。

弊社プロジェクトにおいても、1つのIAに対して、キーボードとゲームパッドのキーをバインドするようにしているのですが、この場合でも同時押しを機能させることはできますか?

以上、よろしくお願いいたします。

ご確認ありがとうございます!

確かに、当方でも、IA_Jumpに複数のキー/ボタンをマッピングすると​、スペースキーの単体押しでステートがOngoingに移ることを確認することができました。

今回の再現プロジェクトだけの事情でいいますと、IA_Jumpアセット​側に設定されている2つのトリガー「Pressed」と「Released」を削除し、Triggersを空っぽにするとスペースキー単体押しによるOngoingへの遷移が発生しないようです。どちらが意図した動作なのか、推奨される設定方法はどのようなものなのかについて、改めてエンジンチームと確認をとるお時間を頂戴できればと思います。

回答を確認次第、お返事申し上げます。​

引き続き、よろしくお願いいたします。

ご確認ありがとうございます。

>今回の再現プロジェクトだけの事情でいいますと、IA_Jumpアセット​側に設定されている2つのトリガー「Pressed」と「Released」を削除し、Triggersを空っぽにするとスペースキー単体押しによるOngoingへの遷移が発生しないようです

↑こちらローカルでも​確認できました。

確認の件、承知致しました。​

よろしくお願い致します。​

お世話になっております。

開発チームに確認を取ったところ、Chord Actionを使用して、Shift+Space同時押しアクションを設定している場面で、片方の入力を入れるとアクションのステートがOngoingに遷移してしまうのは、意図した動作ではないということが分かりました。同時押しが入るまで、StartedもOngoingにも移らず、Noneをキープするのが仕様となります。

そのうえで調査を進めたところ、今回の問題は最新版のUE5.6でも引き続き発生することが分かりました。ただし、IA_Jumpに設定されているようなアクション側の「Pressed」や「Released」を(単に削除するのではなく)Input Mapping Context側のマッピング定義下のTriggersに移動させると、正しく動作(Chord Actionと任意のTriggerの両立が可能)します。問題は、ご使用中のUE5.3ではこのワークアラウンドが機能せず、以前ご案内した

>今回の再現プロジェクトだけの事情でいいますと、IA_Jumpアセット側に設定されている2つのトリガー「Pressed」と「Released」を削除し、Triggersを空っぽにするとスペースキー単体押しによるOngoingへの遷移が発生しないようです

という別の回避策(Chord Actionを設定したアクションでは、ほかのTriggerを設定しない)を行っていただく必要がある点です。

この場合、単発押しのアクションではStartedのデリゲートで操作を書き、押し続けのアクションではTriggeredのデリゲートで操作を書くといった、本来Trigger設定でボタンの押し方をカスタマイズできることが長所だったEnhanced Inputのコンセプトに反し、C++/BP側でボタンの押し方をケアすることになります。

この回避策を受け入れられるかどうかは、プロジェクトの仕様によるところも大きいと思いますが、御社の現在のプロジェクトで導入できそうでしょうか?

UE5.3→UE5.6の変更点が膨大であるため、どのCLでUE5.3時点で抱えていた問題がFixされたのか、ただちにお調べすることが難しく、こちらの回避策でどの程度問題が緩和されるか、ご意見を頂戴できますと幸いです。

以上、よろしくお願いいたします。

ご回答ありがとうございます。

諸々承知致しました。

​アクションにトリガーを設定して使用しているため、同時押しのアクションのみトリガーを空にすることになるかと思うのですが、それを許容できるのかプロジェクト内で確認致します。

お世話になっております。

>Chord Actionを設定したアクションでは、ほかのTriggerを設定しない

プロジェクトで確認しまして、現時点では問題なさそうでした。​

プロジェクトに適用し、同時押しも確認できましたので、こちらクローズで問題ございません。​

ご対応ありがとうございました。​

ワークアラウンドのご確認ありがとうございます。

それでは本件はCloseとさせていただきます。

最後に、Chorded Actionには2点ほど安定しない挙動がみられるため、これらの件も共有させていただきます。

Chorded Triggerが一部の特殊なセットアップで、仕様通りに評価されない

入力アクション側のトリガーにChordedActionが仕込んである場合、ブロッキング機能(同時押しを構成するボタンとかぶる他のアクションの成立を阻む機能)が仕様通り機能しない

[Content removed] (関連スレッド)

また何か問題が生じましたら、ご連絡ください。

以上、よろしくお願いいたします。