ブレンド可能なアニメーション再生機能をブループリントで作ってみた

More than 1 year has passed since last update.

やっとやり方を見つけることが出来たので、書きます。


やりたいこと

UE4 を使っていて、自分が欲しいと思ったアニメーション再生機能はこれです。


  • ブループリントや C++ で【Play】と命令すれば、アニメーションが再生される。

  • ループする/しないや再生スピード、ブレンド時間などは再生する時に決められる。

  • 再生対象となるのは、「アニメーションシーケンス」と「ブレンドスペース」

  • 同じアニメーションを再生し直すことが出来る。

今回は、この要望を満たすアニメーション再生機能を作りました。


アニムグラフを組む

まず、アニムグラフを以下のように組みます。

BlendAnimation.png

見ての通り、アニメーションシーケンスとブレンドスペースの再生情報をダブルバッファリングして、その情報を各アセットプレイヤーや 「Blend Poses By int」ノードに渡しています。

以下、補足です。


アニムグラフノードの入力データピン表示について

ご存知の方も多いと思いますが、アニムグラフノードのパラメータは入力データピンを表示させて外からパラメータを入力することが可能になっているものがあります。

例えば、「Animation Sequence Player」ノードでは、以下のように結構な数のパラメータがピン表示できるようになっています。

AnimSequencePlayer.png

このチェックを入れると、ノードに入力データピンが追加され、変数からデータを入力することが可能になります。


「Blend Poses By int」ノードの注意点

「Blend Poses By int」ノードはデフォルト挙動が 「Active Child Index」を変えても前の再生情報がリセットされない ようになっています。

例えば、「Active Child Index」を「0 -> 1 -> 0」と切り替えて再生するとします。もし、一回目の「0」でアニメーションを最後まで再生し終わってた場合、二回目の「0」ではその再生し終わった時間から再生が始まります。

なので、前に再生していたアニメーションの長さ次第で、二回目の「0」では アニメーションが再生されない、もしくはアニメーションが途中から再生される といった状態になってしまいます。

これを回避するためには、「Blend Poses By int」ノードの「 Reset Chiuld on Activation 」にチェックを入れる必要があります。

ResetChildOnActivation.png

ここにチェックを入れておけば、「Active Child Index」が変わるたびに再生情報がリセットされるようになります。


再生命令を発行する関数を組む

次に、アニメーション BP に再生命令を発行する関数を用意します。

【Play Anim Sequence】

PlayAnimSequence.png

【Play Blend Space】

PlayBlendSpace.png

見ての通り、データの書き込み先となるバッファのインデックスを切り替えてデータを書き込み、「Active Child Index」の値を更新するだけの関数となっています。(「IncrementIndex」ノードは自前で用意したノードで、加算した配列のインデックスを 0 ~ Length - 1 の間でループさせるためのノードです。)

「Active Child Index」の値は毎回切り替えているので、同じアニメーションを再生し直すことも可能です。

また、ブレンドスペースの場合は、後でブレンドスペースの軸の値を変更できるように別途関数を用意します。

【Set Blend Space Axis Value】

SetBlendSpaceAxisValue.png

あとはアニメーションを変更したい時にこれらの関数を呼べば、アニメーションが変更できるようになります。


最後に

これで自分の望むアニメーション再生関数を用意することが出来ました。

ただし、これは全てアニメーション BP に書かれているので、アニメーション BP が増えたら、それをそのままコピペするか、アニメーション BP を複製する必要があります。

流石にそれは面倒なので、次の記事では処理を C++ で組んで、アニメーション BP 依存にならないようにしてみます。