やっとやり方を見つけることが出来たので、書きます。
やりたいこと
UE4 を使っていて、自分が欲しいと思ったアニメーション再生機能はこれです。
- ブループリントや C++ で【Play】と命令すれば、アニメーションが再生される。
- ループする/しないや再生スピード、ブレンド時間などは再生する時に決められる。
- 再生対象となるのは、「アニメーションシーケンス」と「ブレンドスペース」
- 同じアニメーションを再生し直すことが出来る。
今回は、この要望を満たすアニメーション再生機能を作りました。
アニムグラフを組む
見ての通り、アニメーションシーケンスとブレンドスペースの再生情報をダブルバッファリングして、その情報を各アセットプレイヤーや 「Blend Poses By int」ノードに渡しています。
以下、補足です。
アニムグラフノードの入力データピン表示について
ご存知の方も多いと思いますが、アニムグラフノードのパラメータは入力データピンを表示させて外からパラメータを入力することが可能になっているものがあります。
例えば、「Animation Sequence Player」ノードでは、以下のように結構な数のパラメータがピン表示できるようになっています。
このチェックを入れると、ノードに入力データピンが追加され、変数からデータを入力することが可能になります。
「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 」にチェックを入れる必要があります。
ここにチェックを入れておけば、「Active Child Index」が変わるたびに再生情報がリセットされるようになります。
再生命令を発行する関数を組む
次に、アニメーション BP に再生命令を発行する関数を用意します。
見ての通り、データの書き込み先となるバッファのインデックスを切り替えてデータを書き込み、「Active Child Index」の値を更新するだけの関数となっています。(「IncrementIndex」ノードは自前で用意したノードで、加算した配列のインデックスを 0 ~ Length - 1 の間でループさせるためのノードです。)
「Active Child Index」の値は毎回切り替えているので、同じアニメーションを再生し直すことも可能です。
また、ブレンドスペースの場合は、後でブレンドスペースの軸の値を変更できるように別途関数を用意します。
あとはアニメーションを変更したい時にこれらの関数を呼べば、アニメーションが変更できるようになります。
最後に
これで自分の望むアニメーション再生関数を用意することが出来ました。
ただし、これは全てアニメーション BP に書かれているので、アニメーション BP が増えたら、それをそのままコピペするか、アニメーション BP を複製する必要があります。
流石にそれは面倒なので、次の記事では処理を C++ で組んで、アニメーション BP 依存にならないようにしてみます。