ボタンがたくさん必要なので、しゃがみ入力だけで、立ち・しゃがみ・伏せの3状態を切り替えられるようにします。

Game Animation Sample Project(GASP)での具体的な例ですが、考え方はロングジャンプやタメ技発動など他の処理にも応用可能です。
拡張入力の設定
まず、UE5.5の IA_Crouch には、短押し前提のトリガ設定がされているので、長押ししても検知できません。
これを削除して長押しできるようにします。

これで、押し始めで Started 実行ピン、離したときには Completed 実行ピンから処理を駆動できます。

イベント名 | ざっくり意味 |
---|---|
Triggered | 入力が成立している間(基本毎フレーム) |
Started | ボタン押し始めた瞬間 |
Ongoing | (補助的) |
Canceled | 途中で入力中止されたとき |
Completed | ボタン離した瞬間 |
状態遷移の設計
立ち・しゃがみがメインなので短押しでレスポンスよくし、長押しで伏せ関連という作りにすると、こんな感じでいいかなと思います。
現在 | 短押し時 | 長押し時 |
Stand | Crouch | Prone |
Crouch | Stand | Prone |
Prone | Crouch | Stand |


もちろんお好みです
時間計測手段
ゲーム中の時間の差分を計測する方法と、タイマーを使う方法と考えられます。
今回はタイマーを使います。
- Startedで長押しフラグをオフし、長押し処理をタイマーにセットします。
- 長押し処理で、長押しフラグをオンし(短押し処理発動を抑止)、長押し時の状態変化処理を行います。
- Completedでタイマーを止め(長押し処理発動を抑止)、長押しフラグがオフなら短押しの状態変化処理を行います。
実装
CBP_SandBoxCharacter > イベントグラフ > IA_Crouch入力イベント
長押しされているか管理するフラグ変数 hasLongPress を作ります。
Started時にクリアして、Completed時にこのフラグが立っているかいないかで長短を処理分岐させます。
Started
まずフラグオフに初期化します
次にタイマーで長押しされた時のイベントを予約します。時間は0.3秒にしました。(お好みで)
アッドカスタムイベントで新しく作りつなぎましょう(デリゲート)
タイマーのハンドルを変数に保存します。長押しの判定前にキーを離した場合このハンドルで予約イベントをキャンセルできます。
Completed
タイマーをクリアします。(長押しの場合は実行済で、短押しの場合はやりたくないので、共通してクリアで問題ありません。)
フラグが立っているかいないかで分岐します。
長押しフラグが立っている場合は長押しなので、True側には長押し時の処理を、、、しません。

これもお好みですが、長く押しているときは伏せたくて押しているはずなので、
ボタンを離すのを待たずに状態変更してあげたほうが気持ちいいかなと
フラグオフの場合、
- 伏せなら解除
- しゃがみならしゃがみ解除
- そうじゃなければ立ちからしゃがみ
です。
また、従来は落下中のみ状態変更できなくなっていましたが、トラバーサル中もできないようにしておきます
CustomEvent
長押しされたとき呼ばれるので、まず長押しフラグを立てます(これでキーを離したときに短押し側の処理を実行しない分岐ができます)
- 伏せなら伏せ解除(しゃがみ)から1フレーム待って立ちへ
- しゃがみなら伏せ
- 立ちならしゃがみから1フレーム待って伏せへ
こちらも下記の関数で状態変化したくないときは何もしません。
Can Change Stance関数
落下中やトラバーサル動作中は今回の状態変化ができないようにするための判定部分を関数化しました

「純粋」にチェックをつけて実行ピンなしの関数としています。(処理順に影響するような状態変化をさせない関数の場合のみやっていいこと。)
おまけ
立ちから長押しや伏せから長押しの場合、いったん押された瞬間にしゃがみに遷移させてしまえばさらに反応がよくみえそうですが、そのためには事前の状態も変数で管理する必要があり、もう少し複雑になりますね。
そこまでやりたい人はよく考えましょう。
コメント