#概要
UE4のアニメーションアセットはメタデータというユーザー定義の追加パラメータを仕込めるようになっています。アニメーションシーケンス、モンタージュどちらでも)
メタデータはUAnimMetaDataというクラスを継承することで定義できます。
が、自分の確認した範囲ではC++からしかアクセスできないようです。
(BPからのアクセス方法をご存じの方は教えてくだされ)
今回はこいつを使ってアニメーションアセットにゲーム独自の追加パラメータを仕込んでやろうというお話です。
#どんなのデータを定義するか?
今回は次の2項目を定義してみよう。
- 別のモーションでキャンセル可能か?(bool)
- モーション中は重力が働かないようにするか?(bool)
メタデータの定義(C++)
UAnimMetaDataを継承してメンバ変数を持たせてやる。
ブループリントでもクラス自体は作れるが、アクセスはC++からしかできないので、クラスもC++上で作ろう。
#include "Animation/AnimMetaData.h"
UCLASS()
class RUNNERSHIGH_API UMynimMetaData : public UAnimMetaData
{
GENERATED_BODY()
public:
//このアニメーションは中断してもいいやつ?
UPROPERTY(EditAnywhere)
isCancelable = true;
//このアニメーションの再生中は無重力?
UPROPERTY(EditAnywhere)
isUngravity = true;
UMyAnimMetaData() {}
};
#メタデータへのアクセス(C++)
次はアニメーションを再生しているキャラクター側でメタデータにアクセスできるようにしてみよう。
bool AMyCharacterBase::GetIsCurrentMontageCancelable()
{
//再生中のモンタージュを取得
auto currentMontage = GetCurrentMontage();
if (IsValid(currentMontage))
{
//モンタージュからメタデータを取得する
auto metaArray = currentMontage->GetMetaData();
//メタデータが入っていたら
if (metaArray.Num() > 0)
{
//先頭のメタデータを取り出して
auto metadata = Cast<UMyAnimMetaData>(metaArray[0]);
if (IsValid(metadata))
{
//情報を返す
return metadata->isCancelable;
}
}
}
return false;
}
これでC++側の準備は完了。
#実際に使ってみよう
ここからはGUI側で実際に使ってみる。
アニメーションアセットを開いてアセット詳細を見ると、さっそくメタデータとして今作ったクラスが登録できるようになっている。すばやいな。
再生時にこれらのフラグを取得し、対応した処理をすることで、アニメーション毎に挙動を細かく設定することができるというわけだ。
ブループリントからC++の関数にアクセスしてデータを取ってこれる。
UE4のアニメーションモンタージュはイベント発行やセクションを駆使して高機能なタイムラインツールとして使えるが、このメタデータを使えば更なる一歩を踏み出せる。
続きは君の眼で確かめてみろ!
おわり。