UE5のコンボ(先行入力)について
UE5でコンボを行いたいことは多いはず。例えば以前のパンチ攻撃の記事で右手で殴るようにしたが、もう一度ボタンを先行入力することで続けて左パンチ、更にもう一度押せば右パンチと出すようにしたい。
これまでの以下のページをベースにコンボ攻撃を作っていく。
④視点変更
⑤弾を撃つ
⑦死亡処理
先に確認してみてほしい。
Get・SetやSequenceやBranchといった基礎的なノードがわからない場合は先に以下記事を確認してほしい。
アンリアルエンジンのノードの一覧UE5のコンボの目次
コンボ受付時間の設定2回目攻撃の準備
コンボ(先行入力実装)
目次にもどる
コンボ受付時間の設定
現状では攻撃の最中に再度Cキーを押すと、再び処理が行われ最初から右パンチのアニメーションモンタージュが再生されてしまう。
今回はアニメーションモンタージュのある時間をComboTimeとし、ComboTimeに達していないのに再度Cキーが押されても処理が行われないようにする。
そして、ComboTime以降からアニメーションモンタージュの終了までにCキーが先行入力されると、次は左手でパンチを繰り出しコンボになるようにする。
更に左パンチの後は、同様の仕組みで再び右パンチを繰り出し、最大で3連続攻撃が決まるように設定を行っていく。
まず、コンテンツドロワーの任意の場所で右クリックし、ブループリント→ブループリントクラスと選択。
.jpg)
以下の画面で検索し、AnimNotify(アニメーション通知)を選択する(以前使ったAnim通知ステートとは異なり、範囲ではなく位置をピンポイントで指定できる)。

できたファイルの名前をAN_ComboTimeとする。
続いて、以前の記事で作成してある右パンチのアニメーションモンタージュであるAM_Punching_UEを開く。
通知1は既にANS_Attackで使っている。
よって、以下のように通知の矢印を押して、通知2を追加する。
.jpg)
通知2で右クリックし、通知の追加→AN_ComboTimeのように選択して追加。
.jpg)
AN_ComboTimeを今回は以下の位置に配置してみた(先行入力を可能にしたいタイミングの位置へ追加しよう)。
.jpg)
保存して閉じる。
目次にもどる2回目攻撃の準備
2回目の攻撃となる左手パンチについては以下を参考に準備をしてほしい。
・左手パンチのアニメーション
以下のMixamoからとってくる。右手で殴るアニメーションばかりだが、Mirrorにチェックを入れることで左手で殴るモーションになる。
・左手パンチのAnimNotify設定
以下の記事を参考に左手パンチのアニメーションモンタージュを作り、ANS_Attackを配置(ANS_Attack自体は以前の記事で作っているので作成作業する必要はない)。
先ほど行ったAN_ComboTimeの指定を左手パンチのアニメーションモンタージュにも行う。
・左手パンチのコリジョン設定
以下の記事で右手パンチのコリジョン設定を行っているので、同様に作業してほしい。ただし、BP_CharacterのAttackCollisionは既に作っており追加の必要はない。
左手パンチのコリジョンの名前をLeftPunchCollisionとする。
LeftPunchCollisionを選択し右クリックしてイベントを追加し、On Component Begin Overlapを選択。
以下のように右パンチと同様にダメージ処理・吹っ飛ばし関連のノードを配置。
.jpg)
コンボ(先行入力実装)
以前作成したBP_Character(操作キャラや敵の親クラス)に以下のように3つのBoolean型の変数を追加する。
.jpg)
・AttackStart
攻撃処理が開始されたらtrueにして処理を制御する。
・ComboTime
先ほど作成したAN_ComboTimeが呼び出された時に操作する変数。
・TypeAhead
先行入力制御用の変数。ComboTimeがTrueの時にCキーが入力されるとTypeAheadをTrueにする。
以前作成したBP_Player(操作キャラ)を開く。
EnhancedInputAction IA_Punchのところへ以下のように1回目の攻撃用ノードを追加する。
.jpg)
EnhancedInputAction IA_PunchのStarted(つまりCキーが1回押された)以降に処理を作っている。
最初のBranchではCombo TimeがtrueであればType AheadをTrueにする(先行入力が行われたことを示す)。
最初のBranchがFalseの場合は次のBranchへ進み、AttackStartがfalseならAttackStartをTrueにして先の処理に進む。
よって、もしCキーを2連続で押しても、AttackStartがTrueになっているので2回目の処理は起こらない。
その後はSet Visibilityで銃を消し、AttackCollisionに右パンチのコリジョンをセットしている(ここは以前の⑧パンチ攻撃の記事と同じ内容)。
その後のアニメーションモンタージュの再生ノードは以前の記事ではPlay Anim Montageだったが、Play Montageに変更(後述するがPlay Montageならアニメーションが中断した時に処理を行えるため)。右パンチのアニメーションモンタージュを再生するようにする。
ここで一旦、BP_Characterはコンパイルして閉じる。
次に先ほど作成したAN_ComboTimeを開き、オーバーライド選択→Received_Notifyのように選択する。
.jpg)
Received_Notifyを選択し、以下のようにノードを配置する。
.jpg)
アニメーションモンタージュに配置したAN_ComboTimeによって呼び出される。
Received_NotifyのノードのMesh Compの出力からアニメーションモンタージュを再生しているスケルタルメッシュがわかる。そこからGet Owner→Get BP Characterのようにとってくる。変数Combo TimeをここでTrueにしてやる。
BP_Player(操作キャラ)を再度開く。
Combo TimeがTrue状態ならCキーを押すと先行入力として扱われる仕組みがわかると思う。
.jpg)
続いてPlay Montageの後に以下のようにノードを配置していく。
.jpg)
Play MontageのOn Completedの出力はアニメーションモンタージュが完全に完了すると呼び出される。次のノードはBranchでType AheadがTrueかfalseかを判断している。
Type AheadがTrueなら、Combo TimeがTrueの時にCキーが押されたことになり先行入力されていることがわかる。続けてType Aheadをfalse、Combo Timeをfalse、Attack Collisionに左手パンチ用コリジョンをセットし2回目の攻撃の準備をする。その後にPlayer Montageで左手パンチのアニメーションモンタージュを再生する。
Type Aheadがfalse(先行入力されなかった)またはPlay MontageのOn interruptedが出力された(アニメーションモンタージュが中断された)場合は、その後はSet Visibilityにチェックをつけて銃を表示し、AttackStartとCombo Timeの変数もTrueにし、Set Collision Enabledで右パンチコリジョンをNo Collisionとする。
今のところ実装している機能ではアニメーションが中断されることはないが、後々操作キャラが攻撃中に被弾した場合にはアニメーションを中断させることになるので役立つ。
ここまできたら後は繰り返し。以下のように2回目のPlay Montageの後にも同様の処理を作り3回目の攻撃の準備をしよう。
.jpg)
3回目の右パンチが今回は最後の攻撃とする。よってその後は以下のようにノードを配置すればOKだ。
.jpg)
これで以下のように先行入力で最大3回の右→左→右のコンボ攻撃を繰り出せる。
攻撃を1回や2回で止めることも可能だ。