お世話になっております。
レベルシーケンスで、ゲーム中にControl Rigトラックをそのまま読み込むとメモリ消費が激しいため、
1.シーケンサーでは、Control Rigでアニメーションを編集する。
2.編集完了時にアニメーションシーケンスにベイクして、Control Rigを無効化する。
3.ゲーム中ではControl Rigのデータを読み込まず、アニメーションシーケンスで再生する。
というワークフローを考えています。
ここで2点質問です。
1.再編集時にControl Rigにベイクする手間を省くため、Control Rigの編集データはレベルシーケンスに残したいです。
Control Rigの編集データを残したまま、ゲーム中では読み込まない(クックに含めない)ようにする方法はありますか。
2.プロキシバインディングしているアクターのSkeletalMeshCompoentトラックを選択して「アニメーションシーケンスにベイク」すると、
「ベイクに失敗しました」と表示されて、アニメーションシーケンスが作成されません。
プロキシ先のシーケンスまで上がって、ベイク範囲を指定すればベイクできるのですが、こちらはエンジンの仕様でしょうか。
ご確認よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
ご質問の 2 点について以下の通り回答申し上げます。
> Q1: Control Rig 編集データのクック除外について
本来であれば、Control Rig トラックを Deactivate し、クック時に MovieScene.RemoveMutedTracksOnCook=1 を指定する運用で除外できるべきなのですが、実際にこれを機能させるには、2箇所ほどエンジンに手を入れていただく必要があります。
// MovieSceneControlRigParameterTrack.h : 71 行目付近
virtual bool NeedsLoadForTargetPlatform(const class ITargetPlatform* TargetPlatform) const override;
// MovieSceneControlRigParameterTrack.cpp : 99 行目付近
bool UMovieSceneControlRigParameterTrack::NeedsLoadForTargetPlatform(const ITargetPlatform* TargetPlatform) const
{
#if WITH_EDITOR
if (GetCookOptimizationFlags() == ECookOptimizationFlags::RemoveTrack)
{
return false;
}
#endif
return Super::NeedsLoadForTargetPlatform(TargetPlatform);
}
もし、Control Rig トラックを無条件にクックから除外したいということであれば、上記に加え次の箇所にも手を入れていただくことで実現できます。
// MovieSceneControlRigParameterTrack.h : 67 行目付近
#if WITH_EDITOR
virtual ECookOptimizationFlags GetCookOptimizationFlags() const override;
#endif
// MovieSceneControlRigParameterTrack.cpp : 110 行目付近
#if WITH_EDITOR
ECookOptimizationFlags UMovieSceneControlRigParameterTrack::GetCookOptimizationFlags() const
{
return ECookOptimizationFlags::RemoveTrack;
}
#endif
> Q2: SkeletalMeshComponent トラックのベイク失敗について
仕様ではなく、不具合と思われます。再現確認のため、以下の点をお知らせいただけますでしょうか。
・プロキシバインディングを利用したシーケンスの構成について簡単でよいのでお知らせください。「プロキシ先のシーケンスまで上がって」と書いてありますので、サブシーケンスから親側のバインディングを参照していると思われますが、当方が手元で同様の構成を組めるような情報をいただけますと大変助かります。
・ベイク失敗時の Output Log に「MovieSceneToolHelpers::ExportToAnimSequence All parameters must be valid.」というメッセージが出力されておりますでしょうか?
以上、よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
ご返答いただき、ありがとうございます。
いただきました確認事項につきましては、担当者へ確認のうえ、改めてご回答させていただきます。
恐れ入りますが、弊社が夏季休業期間中のため、ご回答は8月18日(火)以降となります。
お待たせしてしまい大変申し訳ございませんが、何卒ご了承くださいますようお願い申し上げます。
引き続き、よろしくお願いいたします。
[Attachment Removed]
承知いたしました。
こちらでアタリがつけられず申し訳ありません。
それでは追加の情報をお待ちする形をとらせていただきます。
引き続き、よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
返答に時間がかかってしまい申し訳有りません。
・Control Rig 編集データのクック除外について
エンジンの改造に着手できないため、後日試してみたいと思います。
・SkeletalMeshComponent トラックのベイク失敗について
仰る通り、サブシーケンスから親側へのバインディングを参照しています。
具体的には、
1.ルートシーケンスにアクターをSpawnableでバインディング登録します。
2.ルートシーケンスの3階層下のサブシーケンスで、1のアクターを参照する形でバインディング登録をします。
3.2でバインディングしているアクターのSkeletalMeshActorComponentトラックを追加します。
4.3のトラックにControlRigトラックを追加して、編集します。
5.3のトラックを右クリックして「アニメーションシーケンスをベイク」を選択します。
6.アニメーションシーケンスオプションはデフォルトのままで、実行するとエラーダイアログが出ます。
またご指摘の通り、以下のエラーログが出力されていました。
LogMovieScene: Error: MovieSceneToolHelpers::ExportToAnimSequence All parameters must be valid.
こちらの情報で再現可能でしょうか。
お手数をおかけしますが、ご確認よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
返信をお待たせして大変申し訳ございません。
頂戴した手順で再現を取ることができました! その後、調査でお待たせしてしまいましたが、おかげさまで原因を特定することができました。
サブシーケンスにフォーカスした状態でベイクする際、内部でSequencer.SubsequenceAnimBakeInIsolationに相当するフラグが一時的に ON に強制変更されるのですが、この切り替えの際に、外側のシーケンスが所有している Spawnable が破棄されたまま再生成されていないため、ベイク対象の SkeletalMeshComponent を取得できず失敗してしまっているようです。
そもそもベイクの評価はルート空間で行われるため、この isolation の強制自体が不要ではないか・・・というのが当方の調査の結論ですが、内部確認に少々お時間をいただきたいと思っております。取り急ぎ、暫定パッチを準備しましたので、問題の現象が解消するかご確認いただけますでしょうか。
Engine/Source/Editor/Sequencer/Private/SequencerBakingSetupRestore.cpp:22付近
namespace UE::Sequencer
{
const TCHAR* CVarName = TEXT("Sequencer.SubsequenceAnimBakeInIsolation");
- static bool bSubSequenceBakingInIsolation = true; //default to false for now will turn it on after more testing
+ static bool bSubSequenceBakingInIsolation = false;
static FAutoConsoleVariableRef CVarSetIsSequencerBakingInIsolation(
CVarName,
bSubSequenceBakingInIsolation,
TEXT("Automatically Force Evaluate Subsequence In Isolation when Baking")
);
Engine/Source/Editor/MovieSceneTools/Private/TrackEditors/CommonAnimationTrackEditor.cpp:1592
AESP.MovieSceneSequence = MovieSceneSequence;
AESP.RootMovieSceneSequence = RootMovieSceneSequence;
- AESP.bForceUseOfMovieScenePlaybackRange = SequencerPtr.Get()->GetSequencerSettings()->ShouldEvaluateSubSequencesInIsolation();
+ AESP.bForceUseOfMovieScenePlaybackRange = MovieSceneSequence != RootMovieSceneSequence || SequencerPtr.Get()->GetSequencerSettings()->ShouldEvaluateSubSequencesInIsolation();
同ファイル:1730付近
AESP.MovieSceneSequence = MovieSceneSequence;
AESP.RootMovieSceneSequence = RootMovieSceneSequence;
- AESP.bForceUseOfMovieScenePlaybackRange = ParentSequencer->GetSequencerSettings()->ShouldEvaluateSubSequencesInIsolation();
+ AESP.bForceUseOfMovieScenePlaybackRange = MovieSceneSequence != RootMovieSceneSequence || ParentSequencer->GetSequencerSettings()->ShouldEvaluateSubSequencesInIsolation();
当方ではこの変更により修正が確認できております。
エンジン改造はすぐ試せないという状況のところ、誠に恐縮ですが、一旦お渡ししておきたいと思います。
引き続き、よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
暫定パッチのご提案までいただき、ありがとうございます。
前回の内容と併せて、確認できましたら結果を改めてご報告させていただきます。
[Attachment Removed]
お世話になっております。
先日の返信に一点当方の確認漏れがありましたので、訂正させていただきます。
ご指摘の「Q2: SkeletalMeshComponent トラックのベイク失敗」現象についてですが、「サブシーケンスまでの階層で尺をトリムしていなければ、設定の組み合わせ次第でエラーなくベイクできる」ことがわかりました。
これにはまずシーケンサーの Evaluate Sub Sequence In Isolation をOFFにし、
[Image Removed]
CVarでSequencer.SubsequenceAnimBakeInIsolation 0を設定します。これでベイクできると思います。
ただし、階層中でSection Rangeを絞っていても、全尺でベイクされてしまうという問題がありまして、これを修正するには先日のパッチが必要である、という状況です。
ご要件をパッチなしで満たせるかどうか、お時間ある際にご確認いただけますと幸いです。
以上、よろしくお願いいたします。
[Attachment Removed]
お世話になっております。追加情報ありがとうございます。
現行プロジェクトでは、ショットごとにシーケンスを分割して、その中にサブシーケンスを置くルールになっています。
そのため、サブシーケンスがトリムされていないケースは存在しません。
大変参考になる情報ではあるのですが、今回の要件を満たすことができない内容のため、残念ながらこちらの方法を採用することは難しそうです。
せっかく情報をご提供いただいたところ恐縮ですが、ご理解いただけますと幸いです。
[Attachment Removed]
お世話になっております。
ご要件について承知いたしました。
ということになりますと、やはり先日お出ししたパッチを当てていただくことが当面の問題回避策になると思います。
お時間のある時にお試しいただけますと幸いです。
引き続き、よろしくお願いいたします。
[Attachment Removed]