8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[UE4][UE5] AnimationRecorderを使って、アニメーションの録画(ベイク)処理をBP・C++から行う方法について

Last updated at Posted at 2022-07-09

はじめに

UnrealEngineにはレベル上のActorの動きをLevel Sequenceとして記録できるTake RecorderSequence Recorder(UE5では非推奨)という機能があります。そして、Skeletal Mesh Componentを持つActorをその記録対象にすると、記録中の動きをAnimation Sequenceアセットとして保存してくれます。

また、Persona(アニメーションエディタ)の録画機能とデバッグ機能を併用することで、こちらでも実行中のキャラのアニメーションを録画することができます。

上記の機能により、Sequencer上で調整したアニメーションやAnim BPによる物理制御・補正込みの結果をAnimationSequenceアセットに保存(ベイク)することができます。

しかし、ただアニメーションをベイクしたいだけなのに機能が多すぎたり、下準備がある程度必要だったりします。一応TakeRecorderに関するノードはいくつかあるので下準備を自動化はできますが、痒い所に少し手が届かないというお話を先日いただきました。
image.png
そういった方に便利なのが、今日紹介する Animation Recorder です!
これをEditorUtility機能と併用することで、自作のアニメーション録画ツールをかんたんに作ることができます!

Animation Recorderとは

その名の通りアニメーションを録画するための機能で、Take Recorder、Sequence Recorder、Personaの録画機能で使われています。なので、決して怪しい機能ではありませんし、録画対象のSkeletalMeshComponentをAnimation Recorderに渡すだけで良いという非常な便利な機能です!

ただ…C++は必須です。でも凄くかんたんです。

Animation Recorderのつかいかた

エディタモジュールの準備

Animation Recorderはエディタ専用機能なので、エディタ用モジュールでAnimation Recorderにアクセスする処理を実装した方が安全です。たぶんランタイムモジュールでも動作しますが、パッケージ作成時に問題になるはずです。

エディタモジュールの作成方法については下記記事を参考にするか、

こちらの無料プラグインを使うのがオススメです。サクッとモジュールを追加できるので重宝してます。

Animation Recorderによる録画開始・終了処理を実装

作成したエディタモジュールにBlueprintFunctionLibraryを追加し、下記のように録画開始・終了をリクエストする処理を組みます。それぞれ一行コードを呼ぶだけなので超かんたんです。

UMyBlueprintFunctionLibrary
// Build.cs
PublicDependencyModuleNames  "SequenceRecorder" 追加

// h
UFUNCTION(BlueprintCallable)
static bool RecordAnimation(USkeletalMeshComponent* Component, const FString& AssetPath, const FString& AssetName);

UFUNCTION(BlueprintCallable)
static void StopRecordingAllAnimations();

UFUNCTION(BlueprintCallable)
static void StopRecordingAnimation(USkeletalMeshComponent* Component, bool bShowMessage = true);

// cpp
#include "AnimationRecorder.h"

bool UMyBlueprintFunctionLibrary::RecordAnimation(USkeletalMeshComponent* Component, const FString& AssetPath, const FString& AssetName)
{
   return FAnimationRecorderManager::Get().RecordAnimation(Component, AssetPath, AssetName, GetDefault<USequenceRecorderSettings>()->DefaultAnimationSettings);
}

void UMyBlueprintFunctionLibrary::StopRecordingAllAnimations()
{
	FAnimationRecorderManager::Get().StopRecordingAllAnimations(); 
}

void UMyBlueprintFunctionLibrary::StopRecordingAnimation(USkeletalMeshComponent* Component, bool bShowMessage)
{
	FAnimationRecorderManager::Get().StopRecordingAnimation(Component, bShowMessage);
}

Animation Recorderによる録画開始・終了処理を呼び出し

あとは実装した各ノードを呼び出すだけです。今回はEditorUtilityWidgetにボタンを追加して、押すと録画開始・終了処理を呼ぶようにしました(説明用なのでSkeletalMeshComponentの取得がすっごく雑です)。
image.png

かんたんですね!
ただ、いくつか注意点があります。

  • エディタ専用機能なので、EditorUtility系のBPで実装するのがオススメです。また、エディタ専用なのでパッケージでは使えません。
  • 「Content/Record」に「RecordTest」というアセット名で保存したい場合、RecordAnimationに指定するAssetPathは「/Game/Record/RecordTest」、AssetNameは「RecordTest」になります。もし連番でアセット名を自動生成したい場合はAssetToolsのCreateUniqueAssetNameノードがべんりです。

使用例(FolderPath =/Game/Record、AssetNameBase = RecordTest と指定する感じ )
image.png

  • 録画フレームレート、録画最大時間などの録画設定のデフォルトは、PersonaのRecording Settingsで設定可能です。
    image.png
    もしプログラム側で制御したい場合は、RecordAnimationに渡すFAnimationRecordingSettingsを生成・設定する必要があります。なおFAnimationRecordingSettingsはBPに対応していないので、FAnimationRecordingSettingsをBPノードの引数ピンとして使うことはできません。ので、よく似た構成の構造体などを用意する必要があります。
UMyBlueprintFunctionLibrary
bool UMyBlueprintFunctionLibrary::RecordAnimation(USkeletalMeshComponent* Component, const FString& AssetPath, const FString& AssetName)
{
   FAnimationRecordingSettings Settings = GetDefault<USequenceRecorderSettings>()->DefaultAnimationSettings;
   Settings.SampleFrameRate = XXX;
   Settings.Length = YYY;

   return FAnimationRecorderManager::Get().RecordAnimation(Component, AssetPath, AssetName, Settings);
}

ちなみに、Length(単位は秒)は最大録画時間なので決められた時間・範囲だけ録画したいというケースで非常に有用です。

  • アニメーション録画は複数同時に実行することができます。また、アニメーション録画を終了してアセットが生成される際にヒッチ(処理が重くてカクつく)が発生します。そして、そのタイミングで別のアニメーション録画処理が走っているとその録画処理が正常に行われない場合があります。そのため、「複数のアニメーションを同時に録画したい」「Sequencerで実装したアニメーションをサブシーケンス毎に録画したい」といったケースでは、StopRecording~は全録画対象のアニメーションが再生し終わってから呼ぶ方が安定する印象です。なお、その際は上述の最大録画時間を設定しないと録画時間が無駄に伸びてしまうので注意です。

さいごに

これで自作のアニメーション録画ツールを作れるようになります。ただ前半で紹介した例のように、アニメーション録画とSequencerと組み合わせる場合はもう少し機能が必要です。具体的には現在開いているSequencerエディタに干渉したり、LevelSequenceの各TrackやSecitonの情報を取ってくる必要があります。
この辺りに関しても質問をいただくことが多くなってきたので、次回以降はその辺りについてご紹介できればと思います。

おしまい

追記

今回紹介した機能などを使ったサンプルを公開しました

8
12
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
8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?