概要
UnrealEngine のアニメ―ションのルートモーションについてのメモです。
更新履歴
日付 | 内容 |
---|---|
2020/10/23 | URO時の問題について追記 |
環境
Windows10
Visual Studio 2017
UnrealEngine 4.22
参考
以下を参考にさせて頂きました、ありがとうございます。
ルートモーションについて
アニメ―ションのルートの移動値であり、移動するようなアニメ―ションの移動した値をアクターへ適用するための仕組みです。
UEではスケルトンツリーのトップにあるボーンから取得するようです。(Rootという名前ではなくても良いらしい)
関連ソース
"Engine\Source\Runtime\Engine\Classes\GameFramework\RootMotionSource.h"
"Engine\Source\Runtime\Engine\Private\GameFramework\RootMotionSource.cpp"
ルートモーション処理
キャラクターへの適用方法です。
適用方法
アニメ―ションシーケンスの[アセット詳細] -> [RootMotion] の [EnableRootMotion] にチェックを入れます。
アニメ―ションBPの[詳細] -> [RootMotion] にて、[Root Motion from Everthing] か [Root Motion from Montage Only]を選択します。
#[Root Motion from Montage Only]はアニメーションモンタージュで再生した時のみとなります。
適用されない場合のトラブルシューティング
アニメ―ションデータが対応していない場合
ルートのボーンが動かないと適用されません。
トップのボーンを指定してプレビューした場合、オレンジの線がでます。
この状態で、[EnableRootMotion]にチェックを入れてプレビューすると、移動が書き出されるため、プレビュー上では移動しなくなります。(オレンジの線がでなくなります)
MovementComponentが対応していない場合
デフォルトでは移動コンポーネントにCharacterMovementComponentを使用していないと適用されません。
その場合はアニメーションインスタンスから移動値を取得して自前でアクターに適用しないとなりません。
以下コード例:
void AMyActor::Tick(float DeltaTime){
// アクターのアニメ―ションインスタンスクラスから移動値を取得
FRootMotionMovementParams _Params = GetAnimInstance()->ConsumeExtractedRootMotion(1.0f);
if( _Params.bHasRootMotion){
// アクターのローカルトランスフォームへ適用
AddActorLocalTransform(_Params.GetRootMotionTransform());
}
}
sweep処理が必要な場合は、AddActorLocalTransform
の第2引数を true
にすればOKです。
その他
URO(Update Rate Optimizations)などを使ってアニメ―ションフレームを飛ばす処理をした場合、当然ながらトランスフォーム値が意図したものとずれてきます。(飛ばされたフレームのデータが取得できません)
この場合、ルートモーションを使うのは避けるしかないと思われます。
まとめ
ルートモーションが上手く動かなかったため、原因をメモ書きとして残しました。