ゲーム作りが大好きな人のブログ

ゲームを作るのが大好きな人のブログ。UE4とBlender、MAYA(LT)、3DCoatを使用しています!

【UE4 Anim Node】ステートマシンをやめて独自アニメーションノードに置き換え

f:id:toofu0:20190719230936p:plain

※確認バージョンはUE4.22.3。中級者向け、C++を使用します。

※アニメーションブループリントをそれなりに理解している人向き

※間違えていたらゴメンナサイ。

題名通りなのですがちょっと前からステートマシンを廃止しました。上の画像が今まで使っていたステートマシンの構造です。

ステートマシンの代わりは独自アニメーションノードです。これによりアニメーションブループリント別に大きく作り直す必要がなくなりました。

 

現在のアニメーションブループリントの構成

下記がそれです。非常にシンプルになってワタクシ大満足。

f:id:toofu0:20190719231121p:plain

アニメーションを管理しているのはMyAnimPlayというノードです。

実装難易度ですがC++を理解していてFAnimNode_LayeredBoneBlendを使わなければ比較的楽です。

 

実装方法

ざっくりと書きます。(全部書くのは量が多すぎて無理)

 

1. FAnimNode_PoseSnapshotをベースにMyAnimPlayを作成する

 ・FAnimNode_PoseSnapshotの中身を大体削除して器だけ作成。

2. FAnimNode_SequencePlayerを変数として定義、適材適所で関数を呼ぶ

 ・これでシーケンスアニメーションが再生可能。

3. FAnimNode_BlendSpacePlayerを変数として定義、適材適所で関数を呼ぶ

 ・これでブレンドスペースが再生可能。

4. FAnimNode_PoseSnapshotを変数として定義、適材適所で関数を呼ぶ

 ・アニメーション補間用。

 

各所で書いている「適材適所で関数を呼ぶ」は主に

 ・Initialize_AnyThread

 ・CacheBones_AnyThread

 ・Update_AnyThread

 ・Evaluate_AnyThread

になります。

アニメーション同士の補間にはFAnimNode_PoseSnapshotを使用していますが、やろうと思えばこれを使わず、同時にアニメーション再生して補間させる事も容易なはずです。ある程度実装できればブレンドスペースとシーケンスアニメーションの行き来が簡単にでき、補間時間も縛られる事なく設定できるようになります。

 

まとめ

ぶっちゃけUE4の中身を流用するだけで大体終わります

実装出来たらどんどん「こういった事をしてみたい」と感じると思います。そういった場合は各クラスの中身を調べれば良いかと。「自分のゲームにはコッチでもこの関数を呼ぶべきだな」みたいなのが分かりますし、処理負荷軽減やメモリ削減も可能です。

非常に自由度が高く楽しい部分でもあるのでやってみてはいかがでしょうか。