LoginSignup
6

More than 1 year has passed since last update.

UE4のアニメーションモンタージュを使ってコンボを実装してみる

Last updated at Posted at 2020-12-07

はじめに

この記事はUnreal Engine 4 (UE4) その3 Advent Calendar 2020の8日目の記事です。

アドベントカレンダー初参加の
現在、絶賛UE4を勉強中のゲームプログラマーです。UE4タノシイ!

勉強の過程で、いわゆるコンボの実装を行うため、Animation Montage(アニメーションモンタージュ)という機能を利用しました。
そこで詰まってしまった所や、調べたことを共有して、もし同じような処理を組む方の参考にでもなればと思い、ここにやり方を記載させて頂きます。

前提

UE4バージョン 4.25.4
使用テンプレート Third Person

手順

  • コンボ用のAnimation Sequenceの用意
  • コンボ用のAnimation Montageを作成
    • Animation Montageに、Animation Sequenceを組み込む
    • Animation Montageに、Montage Sectionを追加する
    • Animation Montageに、通知処理を組み込む
  • PlayerのBP改修
  • Animation BluePrintの改修
    • Animation Montageからの通知を受け取り、Player BPへ流す
    • AnimGraphの調整

となります。では早速、やっていきます!

コンボ用のAnimation Sequenceの用意

今回は、5つの剣攻撃アニメーション(Attack1~Attack5)をコンボさせてみようと思います。
以下の画像通り、5つのAnimation Sequenceを用意しました。
0.png

ここは各自好きなアニメーションを用意してください。

コンボ用のAnimation Montageを作成

Content Browserで右クリック→「Animation」→「Animation Montage」
対象のSkeletonを選択することで、アニメーションモンタージュを作成できます。

以下がアニメーションモンタージュのドキュメントになります。
https://docs.unrealengine.com/ja/Engine/Animation/AnimMontage/Creation/index.html

ここなのですが、少し画面のインターフェイスがドキュメントと異なり、自分も戸惑ったので、画面も添えて説明します。

Animation Montageに、Animation Sequenceを組み込む

アニメーションモンタージュの画面を開いて、Asset BrowserからAnimation Sequenceを追加します。
今回はAttack1~Attack5のAnimation Sequenceを連続して配置します。
右下の「Asset Browser」からドラック&ドロップで配置することができます。
1.png

Animation Montageに、Montage Sectionを追加する

Montage Sectionと呼ばれるものを、アニメーションの好きなタイミングに入れることによって
BP上で「Montage Jump to Section」という関数を利用して、そのタイミングから、アニメーションを再生することができます。
ここは、利用するアニメーションによって、コンボ毎の適切なタイミングに仕込むことになります。

手順としては
「Montage」のエリアの所で右クリック→「New Montage Section」→名前を入れる
これによって、新しくMontage Sectionを追加することができます。

2.png
上図のように、Attack0~Attack4のMontage Sectionを、それぞれのアニメーションの再生開始位置に追加しました。
(名前と違って0から始まっていることに注意です)

この時に追加したMontage Sectionの名前は、上述の「Montage Jump to Section」で利用することになります。

その後、Montage Sectionsのウィンドウを開き、Clearを押しておきましょう。
これを押すと、それぞれのAttackアニメーションを分割して再生することができます。
逆に、Animation Sequenceをそのまま連続して、再生を行う場合は「Create Default」を押しておきます。

Animation Montageに、通知処理を組み込む

続いて、アニメーションの特定タイミングで通知を飛ばすように設定していきます。
(ここが公式ドキュメントと微妙にインターフェイスが異なっていた所でした)

Notifiesの「▼」マークから「Add Notify Track」を押すことで、Notifyのトラックを追加することができます。
追加した、Notifiesトラックは、名前をクリックすることで、名前を変えることができます。
今回は、コンボのために以下のTrackを追加します。

「NotifyActivateComboInTime」
コンボを受け付ける、開始のタイミングを通知します。
コンボ受付中に、プレイヤーの入力があれば
そのときに再生している、Animation Sequenceの特定のタイミングで、指定したMontage Sectionへ再生を飛ばします。

「NotifyDisActivateComboInTime」
コンボの受付を終了するタイミングを通知します。
ユーザーがNotifyActivateComboInTime~NotifyDisActivateComboInTimeまでに
入力を行わなかった場合、次のアニメーションには繋げず、コンボはしない、ということです。

「NotifyCheckJumpSection」
コンボを受け付けたのかどうか、チェックするタイミングを通知します。
このタイミングで、コンボフラグが有効であれば、次のへアニメーションを飛ばして、コンボが繋がります。

Trackの追加が終わったら、それぞれのTrack上で右クリック→Add Notify→New NotifyでNotifyを追加できます。
名前はTrackと同じ名前で良いでしょう。
それぞれのTrackにNotifyを追加していくと、下図のようになりました。

3.png
これでひとまず、アニメーションモンタージュの調整に関しては完了です!

PlayerのBP改修

PlayerのBPを改修していきます。
(Third Parsonのテンプレートを利用している場合は、ThirdPersonCharacterがそのBPにあたります)

以下の変数を、コンボ用の変数として利用するので、追加しておきましょう。
isInvokeCombo...コンボ処理実行フラグ(bool)
isComboInTime...コンボ受付期間中フラグ(bool)
comboCount...現在のコンボカウント(int)

AttackSectionName...定数。今回の場合は「Attack」という文字列が入っています(string)

次に、上記で追記したそれぞれのNotifyが呼び出された時の処理を書いていきましょう。

NotifyActivateComboTime(関数)

isComboInTimeをTrueにして、コンボを受付中とします
5.png

NotifyDisactivateComboTime(関数)

isComboInTimeをFalseにして、コンボ受付期間を終了します
4.png

NotifyCheckJumpSection(関数)

各コンボのアニメーションを終了とさせたいタイミングで飛んできます。
6.png

isInvokeComboが呼ばれていない場合、コンボ処理は不要とされ、後述のEndCombo関数へ処理を流します。
逆にisInvokeComboが立っていた場合、コンボがユーザーによって行われたものとして
「Montage Jump to Section」を利用して、上記の作業で割り当てたMontage Sectionにアニメーションを飛ばすわけです。
Montage Jump to SectionMontageのMontage引数は、先程作成したアニメーションモンタージュを割り当ててください。

ユーザーの攻撃ボタン押下時の通知処理(PlayerのBPのEvent Graph)

ユーザーが攻撃ボタンを押したタイミングで呼び出される処理になります。

7.png
comboCountが0のとき、まだ攻撃自体を開始していないものとして、上記で作成したコンボ用のAnimation Montageを再生します。

「Montage Play」関数になります。これを利用して、Animation Montageを再生することができます。
引数の「Montage to Play」には先程作成した、アニメーションモンタージュを割り当てます。

処理の流れとしては
コンボカウントが0を超えている
コンボカウントがMaxCombo(変数の一覧には記載していませんが、MaxComboは定数で、コンボの最大数が定義されています)を超えていない
コンボ受付期間中フラグ(isComboInTime)がTrue
の場合、コンボ処理実行フラグ(isInvokeCombo)をTrueにします。

※AttackRateは定数で、アニメーションのスピードが入っています。デフォルトは1です。

EndCombo(関数)

8.png
コンボの終了時命令です。
今回の処理では変数をリセットしているだけになります。

以上でプレイヤーのBPの改修は終了です!

Animation BluePrintの改修

最後に、プレイヤーのAnimation Blueprintを改修していきます。
(Third Parsonのテンプレートを利用している場合は、ThirdPerson_AnimBPがそのBPにあたります)

Animation Montageからの通知を受け取り、Player BPへ流す

アニメーションモンタージュからの通知を受け付けて、Player BPへ命令が通知されるようにしましょう。
上記のアニメーションモンタージュの準備で追加した通知は、右クリックを押すと「AnimNotify~」という形で、出てくるようになっています。

9.png
BeginPlayで、ThirdPersonCharacterをキャッシュしておき、上記で記述した関数を呼び出していきます。

AnimGraphの調整

最後にAnim Graphを開いて、右クリック→「Slot 'Default Slot'」を選んで、Default のStateとOutputPoseの間にはさみます。
ここは長くなるので細かいところは省きますが
DefaultSlotにアニメーションがある場合は、そちらを利用して、ない場合はDefault(State Machine)を利用する挙動になると思ってもらえればOKです。

11.png

ここらへんなにかした記憶がないんだけど?となると思うのですが
作成したアニメーションモンタージュで、DefaultSlotがあらかじめ設定されている状態になっています。
10.png
以上でいざ、動かしてみると、無事にコンボの処理を組むことができました!
preview.gif

終わり

以上、長々お付き合い頂きありがとうございました。

アニメーションモンタージュはとても多機能なようで、あくまで今回の使い方としては一例になると思います。
気になる方はぜひ調べてみて、シェアいただけるとうれしいです。

感謝

以下、今回の件とは関係ありませんが、アセット用意するにあたってのアニメーションのリターゲットやスケルトン管理方法など
UE4のアニメーションを勉強する際に参考になったリンクを挙げさせて頂きます。
https://www.slideshare.net/EpicGamesJapan/ue4animation-blueprint
https://www.slideshare.net/EpicGamesJapan/cedec2018-ue4-111104578

以上!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6