見出し画像

UE4 AnimationBlueprint

IKPlugin等を実装したり、解らなかった部分が徐々に見えてきたので纏めておきたいなーという事で書いてみました。

Versionは4.26です。

興味ある方は一開発事例として見て頂くと有難いです。

AnimationBlueprintとは?

Character等のSkeletalMeshのAnimationを制御します。

AnimationBlueprintについて

主にCharacterの移動を制御するんですが、実際はCameraの制御やActorを制御する事も可能です。

大きく分けると、EventGraph、AnimGraphに分類されます。

全体画面

画像2

Skeletonが共通であれば、Meshは複数所持できます。AnimationBlueprintも複数所持できます。

EventGraphで設定したParameterをこちらで取得して、状態遷移を管理します。

画像13

最終的にはOutputPoseにPinをつなぐ事でAnimationが出力されます。

EventGraph

画像12

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は省略します。

全体

画像3

モーションを管理したり、IKを管理したり、LayerAnimationを実行したり、AimOffsetを実行したり、色々出来ちゃいます。

ここからはAnimGraph内でよく使用するノードを纏めていきたいと思います。

LinkedAnimLayer

画像4

version4.24ではβだったそうですが、4.25以降で使えるようになった機能です。それまではAnimGraph内で大量のノードを管理していたのですが、機能毎にLayer管理が出来るようになりました。

フォートナイトでも組み込まれているそうです。

Animation Blueprint Linking を使用する

画像15

公式ではInterfaceを作る所からとありますが、AnimationBlueprint内で追加する事が可能です。

LinkedAnimLayerを使っていない、以前のAnimationBlueprintですが、下の画像の様になっており、中々把握し難いですね...

画像5

全体画像を見てもらえると解りますが、LinkedAnimLayerを使用する事で、かなり見やすく把握出来る様になりました。

BlendPoses

画像6

bool、int、Enum(列挙型)でモーションブレンドが可能なノードです。

主にモーションの分岐処理や、ステートマシンの分岐処理で使用しています。出力Pinは1つですが、入力Pinはint、Enumの場合は任意の入力数が設定できます。

SingleFrameAnimation

画像14

各ステートでAnimationを再生しますが、SingleFrameAnimationに変更する事が可能で、ExplicitTimeに開始Frameを指定できます。

またAnimationSequenceのInterpolationをstepに変更する事で、そのFrameのみの再生も可能です。

How to Play a single frame in AnimGraph
AnimationSequence

Additive

画像7

加算モーションを実行するノードです。

上の画像ではベースモーションにBlendモーションを加算しています。

Slot

画像8

2つまとめて紹介します。

SlotはAnimGraph、AnimationMontageで使用します。

画像9

AnimationMontageは複数のAnimationを1つに纏めて再生したり、一部のAnimationをLoop再生して、条件によって離脱する...といったセクションを管理したりと多岐に渡ります。

AnimationMontageを新規作成する場合はSlotが指定可能となります。

AnimationMontage

AnimGraphではSlotをUpperBodyと指定しています。

AnimationMontageの再生方法

画像12

AnimationMontageはAnimGraphでは管理できません。なので任意のタイミングで再生します。上の画像ではAnimationBlueprintのEventGraphからAnimationMontageを再生するAPIの例です。

またc++でも再生可能です。

UAnimMontage* Sample;

// UAnimInstanceを継承したカスタムクラス
void USampleAnim::Play()
{
    Montage_Play(Sample);
}

LayerBlendPerBone

画像12

先ほどのUpperBodyに影響を与えるBoneの設定が行えます。

上の画像ではspine_02と設定し、2つのステートマシンをブレンドしています。BlendPosesノードと同じ様に複数入力Pinの設定が可能です。

CachePose

画像11

StateMachineのCache、そのCacheを呼び出すノードです。

上の画像ではAnimGraph全体をCachePose、UseCachePoseで管理しています。

簡単に流れを書いておくと、

BaseステートマシンはPostLayerChacePoseに渡す。

PostLayerChacePoseを呼び出し、Aimステートマシンを経由し、PostAimOffsetCachePostに渡す。

PostLayerChacePose、PostAimOffsetCachePostを呼び出し、ResultCachePoseに渡す。

ResultCachePoseを呼び出し、IKステートマシンを経由し、出力する.....という流れです。

最後に

如何でしたでしょうか?最初はかなり難しいイメージを持つと思いますが、慣れてくると直感的に操作ができます。

AnimationはAssetが肥大化しやすいので、なるべくコストがかからない管理を行いたい所です。



この記事が気に入ったらサポートをしてみませんか?