UEの勉強をしていますが、UEのアニメーション周りは何かゴチャゴチャしてて今まで意味不明でした。

そこで、おかずさんの「猫でも分かるUE4」の「#5 Animation ブループリントの使い方を学ぼう!」と「#6 自作・購入したキャラクタを動かしてみよう!」あたりを観てみたら、何となく大体分かってきました。

まず、そもそも論として、ThirdPersonCharacterが持ってるような”クラスブループリント”とは別に、アニメーション関係を処理する”アニメーションブループリント”が別れて存在する事が何でなの?みたいな感じでよく分かってませんでした。

しかし、理解してみれば、いわゆるMVPパターンのように、モデルとビューを分離しようとしている的な考え方らしいなと分かりました。

それで、私はUnityには慣れていますから、この機能はUnityで言えばあれだな…みたいな感じでUnityに例えていく事で割と理解が進みました。

というわけで、ThirdPersonCharacterのクラスブループリントから見てみましょう。↓

ここでやっているのはいわゆる操作キャラクターのロジック部分です。
まあThirdPersonCharacterではシンプルな入力処理しかやってません。
マウスカーソルを動かすと視点が移動、スペースキーを押すとジャンプ、WASDで移動する処理が書かれています。

ここで言う、”ジャンプ処理”とかはあくまでキャラの座標を動かすだけで、アニメーション関係には一切触れてない点に注目です。
アニメーション関係の処理は全部アニメーションブループリントの方に任せる事で、ThirdPersonCharacterは汎用的に利用できるようになります。

例えばアニメーションを一切持たない四角い豆腐みたいなキャラだとしても、問題なくThirdPersonCharacterを使用することができるでしょう。アニメーション処理を分離しているおかげです。

というわけで、次は問題のアニメーションブループリントの方を見てみます。「ThirdPerson_AnimBP」です。

まずこれがアニメーションブループリントのイベントグラフです↓

これが何をしているのか?というと、まずアクタの情報を取得するために、PawnOwnerを取得して、それから自分が空中にいるかどうかを取得し、ステートマシンが参照するパラメータとしてセットしています。同様に、速度も取得してきて、スピードに変換してセットしています。それを毎フレームやってる感じです。

要するに、Unityで言う所の、スクリプトでCharacterControllrerを参照して、Animator.SetFloat(“Speed”)みたいな感じでAnimationControllerのパラメータをセットしている部分と同じです。

だったらこんなもん、わざわざアニメーションブループリントとか言って分けたりせずに全部クラスブループリントに書きゃいいだろ!と思うかもしれませんが、先ほど書いたように、こうやって分離する事で、ThirdPersonCharacterのクラスブループリントはアニメーションについて関与しないで済むので、どんなキャラにでも汎用的に使用できるようになるというメリットがあります。

次に、アニメーションブループリントの、ステートマシンを見てみましょう↓

これはもう、ぶっちゃけUnityで言う所のAnimationControllerと完全に同じです。
先ほどのイベントグラフで設定されたパラメータを見ながら、ステートが遷移していきます。

それぞれのステートにはその状態の時に再生すべきアニメーションが入っています。
ただし、UEではステートごとにまたブループリントみたいなのが書けます。↓

まあ柔軟と言えば柔軟ですが、こんなもん、大抵は単にアニメーションが割り当てられてるだけで、実際にこの例でもそうなってます。

とは言え、ステートにブレンドスペースという物が割り当てられてるケースもあります。↓

これはIdle/Runのステートですが、ブレンドスペースを使うと「スピードが0の時はアイドルモーション、スピードが100の時は歩きモーション、スピードが400の時は走りモーション。そんでこれらがスピードパラメータに応じていい感じにブレンドされる」みたいなのが簡単にできます。これをステートマシンだけでやろうとしたら厄介な事になります。
2次元表現も使えるので、左右方向への歩きや走りモーションもブレンドできます。

これはUnityで言えばブレンドツリーです。Unityでもステートにブレンドツリーを割り当てられるので、それと同じです。

UEはステートのそれぞれの遷移条件もこれまたブループリントで書けます。まあ柔軟っちゃ柔軟ですが、やり過ぎ感もあります。↓

それで、結局のところこのステートマシンがやってる処理は、普段はスピードに合わせてアイドル、歩き、走りモーションを再生していて、自分が空中にいる事を検知したら、JumpStartモーション再生、一定時間でJumpLoopモーションに移行して、地面に着地したらJumpEndモーションを再生したのちにアイドルに戻る。という流れです。

で、これで終わりか?と思いきや、さらにアニメーションブループリントにはAnimGraphというものまであります。↓

AnimGraphでは、ステートマシンなどの結果を踏まえて、キャラクターの最終的な出力モーションを決定します。

ここでは、ただ単にステートマシンの結果をそのまま出力ポーズに繋いでますね。

まあ大抵はこれで済むと思うので、だったらAnimGraphなんて要らねえじゃんと思いそうですが、例えば上半身と下半身で別々のステートマシンを持っていて、それらをブレンドしたい、(FPSなんかだと上半身と下半身が別々に動いたりします)というケースがある場合、AnimGraphが必要になります。

猫でも分かるUE4で、上半身と下半身で別々のアニメーションを再生するのをやって見せてます。↓

ちなみにこのような処理をUnityでやる場合は、UnityはAnimationControllerにレイヤー機能を持っており、レイヤー毎にボディマスクを設定できますから、それを使って同じような事が出来ます。

他の機能として、UEではアニメーションシーケンスに通知(Notify)を仕込んで、アニメーションが再生された時にイベントを発火できます。
まあこれも、Unityでもアニメーションイベントからスクリプトのメソッドを呼び出せるので、それと同じでしょう。

UnityとUEのアニメーション機能を比較した場合、UEでは何でもかんでも全てブループリントを使って柔軟に書けるので、分かってしまえばUnityより柔軟かもしれません。

さて、サードパーソンテンプレートでやってる処理は以上ですから、「猫でも分かるUE4」でもここまでしか解説がありませんでしたが、UEにはアニメーション関係の機能はもっと色々あるようです。

たとえばアニメーションモンタージュのような機能があります。
これは何かというと、大雑把に言えば複数のアニメーションを繋げてひとまとまりにして再生できる機能のようです。
単にそれだけでは無く、プレイヤーの入力に合わせてアニメーションの一部をループさせたり途中を飛ばしたりできます。

ですから、たとえばリロードする弾数に合わせて弾込めアニメーションをループさせたい時とか、あるいは剣で攻撃する時のコンボ攻撃の実装などに使われるようです。

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

UE5の新機能として登場したMotion Warpingという機能もあります。
これは、アニメーションモンタージュの途中でキャラを好きな場所に移動できる機能です。
これを使えば、例えばコンボ攻撃で敵の所まで自動で移動する、みたいな事ができます。

[UE5] Motion Warpingでアニメーションによる移動量を自由にコントロール!

UEにはIK機能があります。
アニメーションとは別に、手や足の位置を指定できます。たとえばドアを開ける時にキャラクターにドアノブを握らせるのに使えます。
まあこれはUnityでもあったので分かります。

UE5ではフルボディIK機能も追加されました。
これはまあ文字通りフルボディIKで、Unityで言う所のFinalIKみたいな遊び方ができると思います。

さらに他の機能としてはコントロールリグというものもあります。
私はとりあえずエディタ上で簡単にマネキンにポーズを付けれる機能として理解してますが、他にもランタイムでプロシージャルアニメーションを実行するのに使えるようです。

UEのアニメーション機能、大体そんなもんかな…と思ったら、こちらによるともっと何やかんや色々な機能があるようです。↓

[CEDEC2018] UE4アニメーションシステム総おさらい

まあ細かい機能は必要に応じておいおい学んでいけばいいでしょう。

私としては、おかずさんの「猫でも分かるUE4」のおかげで、今までゴチャゴチャしててサーパリ分からなかったUE4のアニメーション周りの概要が掴めて助かりました。

UEも、Unityの時もそうでしたが、正直言ってドキュメントを読んでも大抵は何言ってるのか全然理解できません。

「猫でも分かるUE4」のように、私でも分かるように解説してくれると大変助かります。
正直、おかずさんにはこの調子でUEの全部の機能を解説して欲しいです。