理屈としては以前の回答の通りでセクションの位置と再生範囲との関係を加算・減算して相対的な位置を得るくらいなのですが、
頂いた情報をふまえて SubSection を用いた入れ子構造に対応したサンプルを添付しておきます。
`void UMyBlueprintFunctionLibrary::CheckLevelSequenceFrames2(UMovieSceneSequence* Sequence, FFrameNumber OffsetFromRoot)
{
UMovieScene* MovieScene = Sequence->GetMovieScene();
TRange Range = MovieScene->GetPlaybackRange();
UE_LOG(LogTemp, Log, TEXT(“Sequence %s”), *Sequence->GetName());
UE_LOG(LogTemp, Log, TEXT(“-PlaybackRange=[%d %d]”), Range.GetLowerBoundValue().Value, Range.GetUpperBoundValue().Value );
UE_LOG(LogTemp, Log, TEXT(“-RangeInRoot=[%d %d]”), OffsetFromRoot.Value, (OffsetFromRoot + Range.GetUpperBoundValue()- Range.GetLowerBoundValue()).Value);
TArray<UMovieSceneSection*> Sections = MovieScene->GetAllSections();
for (auto Section : Sections)
{
UE_LOG(LogTemp, Log, TEXT(“[%s]”), *Section->GetName());
TRange SectionRange = Section->GetRange();
if (SectionRange.HasLowerBound() && SectionRange.HasUpperBound())
{
UE_LOG(LogTemp, Log, TEXT(“-LocalRange=[%d %d]”), SectionRange.GetLowerBoundValue().Value, SectionRange.GetUpperBoundValue().Value);
UE_LOG(LogTemp, Log, TEXT(“-RangeInRoot=[%d %d]”), (OffsetFromRoot + SectionRange.GetLowerBoundValue() - Range.GetLowerBoundValue()).Value, (OffsetFromRoot + SectionRange.GetUpperBoundValue() - Range.GetLowerBoundValue()).Value);
UMovieSceneSubSection* AsSubSection = Cast(Section);
if (IsValid(AsSubSection))
{
FFrameNumber NewOffset = OffsetFromRoot + SectionRange.GetLowerBoundValue() - Range.GetLowerBoundValue();
CheckLevelSequenceFrames(AsSubSection->GetSequence(), NewOffset);
}
}
else
{
UE_LOG(LogTemp, Log, TEXT(“-Open Section”));
}
}
}`■ShotTrack のセクションは UMovieSceneCinematicShotSection (UMovieSceneSubSection を継承) です
Cast 後 AsSubSection->GetSequence() のようにして中身のシーケンスを参照できます。
ルートからの位置関係を順次渡しながら再帰呼び出しを行うことで入れ子構造に対応しています。
■フレーム番号は TickResolution (デフォルトでは 24000fps)で管理されています
エディタ上の表示フレームレート(デフォルトでは 30fps)に合わせたい場合は単に比率を用いて換算(この場合は800で除算)しても充分かもしれませんが、FFrameRate::TransformTime 関数を用いるのが正確な対応ではあります。
なお TickResolution / 表示フレームレートはそれぞれ
MovieScene->GetTickResolution() / MovieScene->GetDisplayRate()
のようにして取得できます。
よろしくお願いいたします。