C++幼女先輩

プログラミング成分多め

アニメーションブループリントで モーション合成

はじめに

ゲームのサンプル書いているけど仕事のほうが忙しく、作業すすまないため Tipsを書くことに

Tipsと言う名の、自分のためのメモでもある

今回の内容

ブループリントに関して何も言及していないのにアレだが アニメーションブループリントは、通常のブループリントと全く違う。別物である アニメーションの合成機能と簡単な計算しかないので この間仕事で使った機能を

アニメーションブループリントを作成する

テンプレートより ブループリントの ThirdPersonを選ぶ

Content/Mannequin/Animations/ThirdPerson_AnimBP があるのでそれを開く このファイルが今回HACKする アニメーションブループリントだ。

同じフォルダに複数ファイルがあるが

ThirdPerson_IdleRun_2D これは、後述するブレンドスペース。名前は2Dになっているが中身は BlendSpace1D なんでだ?? それ以外は JumpやWalk、Run、Idleの モーションファイル

初期状態

テンプレートを実行したら

f:id:murasame-labo:20160926105429p:plain

TPS視点でグレーマンが 移動、カメラ回転、ジャンプ が出来るだけの単純なデモが実行される コントロール部分は ThirdPersonCharacterの EventGraphにルーチンが書いてあるのでそちらを参考に。

今回のアニメーションで注目すべきは まず歩き。 アナログパットを少しだけ傾けると ゆっくり。大きく傾けると 前傾姿勢になり走っていると思う これは Idle、Walk、Runを 速度によりブレンドしているので、なめらかにつながっている

この、アニメーションのブレンドを、ブレンドスペースという

先程のThirdPerson_IdleRun_2Dというファイルで Idle、Walk、Runを合成している

2つ目は ジャンプ。これは ジャンプスタート、ジャンプ中、ジャンプ終了と3つのアニメーションを組み合わせて、ステートマシンを形成している

とりあえず今回注目は この2つ

ブレンドスペース

ThirdPerson_IdleRun_2D Unrealではヘルプを読むかぎり 現状は2軸のアニメーションブレンドしか出来ないが将来的に拡張する予定らしい。 今回は Idle~Runまでの1軸のブレンドなので、 BlendSpace 1Dを使っている

似た機能にAimOffsetがあるが、こっちは加算アニメーション等 BlendSpaceより多少機能が充実しているらしい

ThirdPerson_IdleRun_2Dを開くと 下記の画面がある f:id:murasame-labo:20160926112527p:plain

縦軸がスピードで、今回はレンジが 0-375になっている。 黒い点が Idle、Walk、Runのモーションで、Speedという引数により ブレンド係数が変わるようになっている

今回は1Dなので横軸はないが、例えば 上半身を左右に動かす Directionという引数を横軸にもって 2Dでブレンドすることも出来る

プレビューで簡単にブレンドが確認できるのでとても便利ですね。

f:id:murasame-labo:20160926113152p:plain

AnimGraph(Idle/Run state)で こんな感じに Speedを引数に アニメーションを作ります

ジャンプ ステートマシン

ステートマシンを開く f:id:murasame-labo:20160926113602p:plain

初期状態が Idle/Run(先程のブレンドスペース)で、ジャンプをすると JumpStart->JumpLoop->JumpEnd->Idle/Run  という流れ

それぞれ該当する モーションをFinalPoseにすれば良い。簡単。

ブループリントから変数を受け取る

色々な理由で ブループリントから値を渡したい事があると思う。

今回は ThirdPersonCharacterから TestHogeというBool値を渡す

ThirdPersonCharacterのEventGraphで、 ZでTestHoge設定、Xでクリア する f:id:murasame-labo:20160926120028p:plain

これを ThirdPerson_AnimBPのアニメーションBPで取得するには PawnOwnerからCastしてThirdPersonCharacterを取得する ここで気をつけるのは、アニメーション ブループリントのOwnerはAnimInstanceであって、キャラクターではない キャラクターは PawnOwner

f:id:murasame-labo:20160926121255p:plain

TryGetPawnOwnerを ThirdPersonCharacterにキャストし、そこから TestHogeを取得。 Blend Poses by bool にて、TestHogeがtrue時は 今まで通りのブレンドスペース歩き falseの時は Idleを設定してみた

実行結果は、Zキーを押すと ブレンドされた歩きに、Xキーを押すと Idleのまま地面を滑る ようになり、正常に ブループリントから値を渡せた事が確認できる

各種ブレンド

上記に Blend Poses by bool が出たので、各種ブレンドを簡単におさらい 基本的にはアニメーションブループリントは アニメーションのブレンドと、そのための簡単な計算しかできませんので ブレンドを覚えたらほぼ終わりです

f:id:murasame-labo:20160926123244p:plain

左から

Blend

一番単純なブレンド。 AとBの2個のアニメーションをブレンドするのみ。 Alphaでブレンド係数を変更できます

Blend Poses by bool

ActiveValue 引数のbool値により、TruePoseとFalsePoseに分岐します。ブレンド無し。 各モーションの補完時間も指定可能

Blend Poses by int

ActiveChildIndex 引数のint値により 複数のモーションに分岐。ブレンドなし AddPinでポーズは複数追加できる 各モーションの補完時間も指定可能

Layered blend per bone

影響ボーンを指定し、ボーンごとにブレンドすることが可能 指定ボーン以下の子ボーンが合成される。ボーンも複数指定可能 例えば 右腕だけ合成、上半身だけ合成、右腕と左腕のみ合成 等を行うことが出来る Add pinで ブレンドを増やせるので、ウエイト違いで複数合成可能

Blend Poses (Enum)

基本的に ステートマシンを使うが、Enumを使ってアニメーション制御も可能 ActiveEnumValueにEnum変数を指定し、そのEnum値により ポーズを分岐させる事が可能

以上!