LoginSignup
7
4

More than 3 years have passed since last update.

UE4 アニメ―ション管理についてのメモ

Last updated at Posted at 2019-07-26

概要

UnrealEngineのアニメーション管理についてのメモです。
アニメ―ションシーケンスをステートにしてステートマシンを組むと煩雑になってしまうのを何とかできないか、と試してみた記録です。

アニメ―ションシーケンスを変数化して再生するケースとステートマシンを複数持って分散しブレンドポーズさせてみるケースを書いています。

修正履歴

日付 内容
2019/10/10 ステートマシン切り替え時の注意点を追記

環境

Windows10
Visual Studio 2017
UnrealEngine 4.22

参考

以下を参考にさせて頂きました。ありがとうございます。
http://unrealengine.hatenablog.com/entry/2016/03/28/221426

ステータス内でシーケンスを直接再生

アニメーション再生ノードにて、アニメ―ションシーケンスを引き数にして入れ替え可能にしてみます。

ステータスの修正

通常、アニメーション再生をする場合のステート内はアニメ―ションシーケンスノードからアウトプットノードへつなぐようになっています。
state_playanim.png

[Settings]の[Sequence]を書き換え可能にし、[変数に昇格]させて、[PlayAnimSeq]と名前をつけます。
state_playanum2.png

アニメ―ションシーケンステーブルの用意

[AnimSequence]型のテーブルを用意して各アニメーションを割り振ります。
table_detail.png

アニメーション再生用ブループリント

指定したアニメーション番号から再生できるような関数ブループリントを作成します。
PlayAnumBP.png
先に変数にした[PlayAnimSeq]へ入れます。

ステートマシンの設定

ブーリアン変数[IsSetAnim]がtrueになったらステート移動,falseなら戻すように遷移ルールを設定します。

single_state.png

ブループリント関数を実行することにより、ステートに設定されている「アニメ―ションシーケンスを再生」ノードにはいるアニメ―ションシーケンス変数にデータが設定されることにより再生できます。

ブレンドポーズによる管理

ステートマシンを複数使い、変数で切り替え管理しブレンドポーズノードでアニメーションを出力させてみます。

Enumの用意

アニメーションBPの親クラスのC++側にEnumの定義を用意します。
BluePrintの列挙型でも可。

MyAnimInstance.h
// ステータス
UENUM(BlueprintType)
enum class ECharaState : uint8 {
    ST_NONE     UMETA(DisplayName = "None"),
    ST_IDLE     UMETA(DisplayName = "Idle"),
    ST_ATTACK   UMETA(DisplayName = "Attack"),
    Num         UMETA(Hidden)
};

定義したEnumを変数で持ちます。

var_state.png

アニムグラフの設定

定義したEnumに対するブレンドポーズが選択できるのでブループリントを作成していきます。

blendpose_node.png

入力の[ActiveEnumValue]は先ほど作成したEnumの変数を繋ぎます。
各ポーズは各ステートマシンを作成して繋ぎます。

ステートマシンの設定

各ステートマシンはそのステート内でアニメーションをセットするだけにします。さらに細かいステートがある場合はサブステータスを追加して分岐させます。
ステートマシン1つ目。
Idle_SM.png

ステートマシン2つ目。細かいサブステートがある場合は下のような感じです。
Attack_SM.png

アニムグラフの状態は最終的に以下のようになります。
BlendPose.png

複数ステートマシンでアニメーションをブレンドポーズを使って設定されます。ステータスは ECharaState の変数のみで切り替えます。

ステートマシン切り替え時の注意点

高速でステートマシンを切り替えた時、切り替えたステートマシンのステートがリセットされない(アニメーションが以前の途中から再生される)場合があります。(ステートマシンAからステートマシンBへ切り替えてすぐステートマシンAへ戻すような場合)
これはステートマシンのステートがリセットされるタイミングがブレンド終了時に行わるため、ブレンド終了する前に切り替えて戻すと前のアニメ―ションのままとなってしまいます。

明示的にステートマシンのステートをリセットすることができないため、ブレンド時間を0にするか、スロットアニメ―ションなど別の方法でアニメ―ションを割り込ませるようにしないとならないようです。

トランジッションのブレンド時間設定を変える方法を採る場合は以下の値を小さくすることで実現できます。
Transition_Blendsetting.jpg

追記:イベント

アニメ―ションシーケンスに追加する通知以外にステートとトランジションにイベントを追加できます。

ステート

各ステートにはデフォルトでイベントを設定可能です。
state_detail.png

ステート開始イベント はステートに遷移した時。
ステート離脱イベント は別のステートへ遷移する時。
ステートブレンド完了イベント は前のステートとのアニメ―ションブレンドが完了した時。

1ステートに1アニメ―ションを設定した場合は、そのままアニメーションの終了が離脱イベントで取得できますので、いちいちアニメ―ションシーケンスで通知を追加する必要はありません。

トランジション

各トランジションにもイベントが設定可能です。
transision_detail.png

トランジションイベントを開始 はステートが遷移条件を満たして移行開始時。
トランジションイベントの終端 はステートが遷移し終わった時。(元のアニメーションがブレンドし終わったとき?)
トランジションイベントを中断 はステートが遷移途中で遷移条件を満たさなくなった時。

まとめ

ステートマシンを複雑化させないようにしたいですが、どうしても複雑化してしまうのでもう少しいい方法を探したいです。
次の方法としてはGameplayTagを使うとよさそうなので調べてみたいと思います。:mag:

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4