
UE4 AnimationBlueprint
IKPlugin等を実装したり、解らなかった部分が徐々に見えてきたので纏めておきたいなーという事で書いてみました。
Versionは4.26です。
興味ある方は一開発事例として見て頂くと有難いです。
AnimationBlueprintとは?
Character等のSkeletalMeshのAnimationを制御します。
AnimationBlueprintについて
主にCharacterの移動を制御するんですが、実際はCameraの制御やActorを制御する事も可能です。
大きく分けると、EventGraph、AnimGraphに分類されます。
全体画面
Skeletonが共通であれば、Meshは複数所持できます。AnimationBlueprintも複数所持できます。
EventGraphで設定したParameterをこちらで取得して、状態遷移を管理します。
最終的にはOutputPoseにPinをつなぐ事でAnimationが出力されます。
EventGraph
c++、AnimationBlueprintの関数や変数を呼び出したり、Interfaceを呼び出したりとBlueprintと同等の機能を扱えます。
c++で書く場合は基本的にUAnimInstanceクラスを継承する事で実装できます。
#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "SampleAnim.generated.h"
UCLASS(transient, Blueprintable, hideCategories = AnimInstance, BlueprintType)
class SAMPLE_API USampleAnim: public UAnimInstance
{
GENERATED_BODY()
public:
USampleAnim(const FObjectInitializer& ObjectInitializer);
virtual void NativeInitializeAnimation() override;
virtual void NativeUpdateAnimation(float DeltaTimeX) override;
};
#include "AnimInstance/SampleAnim.h"
USampleAnim::USampleAnim(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
// Constructor
// メンバ変数の初期化
}
void USampleAnim::NativeInitializeAnimation()
{
// 初期化
// PawnやActorを取得する
Super::NativeInitializeAnimation();
}
void USampleAnim::NativeUpdateAnimation(float DeltaTimeX)
{
// 毎フレーム呼ばれる
// PawnやActorを取得し、変数を更新する。
Super::NativeUpdateAnimation(DeltaTimeX);
}
割とc++で書いちゃうので今回はEventGraphは省略します。
全体
モーションを管理したり、IKを管理したり、LayerAnimationを実行したり、AimOffsetを実行したり、色々出来ちゃいます。
ここからはAnimGraph内でよく使用するノードを纏めていきたいと思います。
LinkedAnimLayer
version4.24ではβだったそうですが、4.25以降で使えるようになった機能です。それまではAnimGraph内で大量のノードを管理していたのですが、機能毎にLayer管理が出来るようになりました。
フォートナイトでも組み込まれているそうです。
Animation Blueprint Linking を使用する
公式ではInterfaceを作る所からとありますが、AnimationBlueprint内で追加する事が可能です。
LinkedAnimLayerを使っていない、以前のAnimationBlueprintですが、下の画像の様になっており、中々把握し難いですね...
全体画像を見てもらえると解りますが、LinkedAnimLayerを使用する事で、かなり見やすく把握出来る様になりました。
BlendPoses
bool、int、Enum(列挙型)でモーションブレンドが可能なノードです。
主にモーションの分岐処理や、ステートマシンの分岐処理で使用しています。出力Pinは1つですが、入力Pinはint、Enumの場合は任意の入力数が設定できます。
SingleFrameAnimation
各ステートでAnimationを再生しますが、SingleFrameAnimationに変更する事が可能で、ExplicitTimeに開始Frameを指定できます。
またAnimationSequenceのInterpolationをstepに変更する事で、そのFrameのみの再生も可能です。
How to Play a single frame in AnimGraph
AnimationSequence
Additive
加算モーションを実行するノードです。
上の画像ではベースモーションにBlendモーションを加算しています。
Slot
2つまとめて紹介します。
SlotはAnimGraph、AnimationMontageで使用します。
AnimationMontageは複数のAnimationを1つに纏めて再生したり、一部のAnimationをLoop再生して、条件によって離脱する...といったセクションを管理したりと多岐に渡ります。
AnimationMontageを新規作成する場合はSlotが指定可能となります。
AnimationMontage
AnimGraphではSlotをUpperBodyと指定しています。
AnimationMontageの再生方法
AnimationMontageはAnimGraphでは管理できません。なので任意のタイミングで再生します。上の画像ではAnimationBlueprintのEventGraphからAnimationMontageを再生するAPIの例です。
またc++でも再生可能です。
UAnimMontage* Sample;
// UAnimInstanceを継承したカスタムクラス
void USampleAnim::Play()
{
Montage_Play(Sample);
}
LayerBlendPerBone
先ほどのUpperBodyに影響を与えるBoneの設定が行えます。
上の画像ではspine_02と設定し、2つのステートマシンをブレンドしています。BlendPosesノードと同じ様に複数入力Pinの設定が可能です。
CachePose
StateMachineのCache、そのCacheを呼び出すノードです。
上の画像ではAnimGraph全体をCachePose、UseCachePoseで管理しています。
簡単に流れを書いておくと、
BaseステートマシンはPostLayerChacePoseに渡す。
PostLayerChacePoseを呼び出し、Aimステートマシンを経由し、PostAimOffsetCachePostに渡す。
PostLayerChacePose、PostAimOffsetCachePostを呼び出し、ResultCachePoseに渡す。
ResultCachePoseを呼び出し、IKステートマシンを経由し、出力する.....という流れです。
最後に
如何でしたでしょうか?最初はかなり難しいイメージを持つと思いますが、慣れてくると直感的に操作ができます。
AnimationはAssetが肥大化しやすいので、なるべくコストがかからない管理を行いたい所です。