シーケンサーの有効範囲を簡単に知りたい

すみません、詳細が消えてました。

お世話になっております。

ルートのUMovieSceneと、UMovieSceneSectionなどから以下のものが取れないでしょうか。

・ルートの有効範囲と、UMovieSceneSectionの有効範囲(両方とも共有している有効範囲)

・ルートのフレーム位置から、UMovieSceneSectionのフレームの位置

・UMovieSceneSectionのフレーム位置から、ルートのフレームの位置

主な用途としてはSpawnしたアクタの情報を取得するのに使用します。

よろしくお願いいたします。

お世話になっております。

>・ルートの有効範囲と、UMovieSceneSectionの有効範囲

LevelSequence の再生範囲は

LevelSequence->GetMovieScene()->GetPlaybackRange()

のようにして取得できます。

セクションについては

Section->GetRange()

のようにできます。

以下に LevelSequence およびそれに含まれるセクションの範囲をログに出力するサンプルを載せておきます。

`#include “LevelSequence.h”
include “MovieScene.h”

void UMyBlueprintFunctionLibrary::CheckLevelSequenceFrames(ULevelSequence* LevelSequence)
{
UMovieScene* MovieScene = LevelSequence->GetMovieScene();

TRange Range = MovieScene->GetPlaybackRange();

UE_LOG(LogTemp, Log, TEXT(“LevelSequence %s”), *LevelSequence->GetName());
UE_LOG(LogTemp, Log, TEXT(“Range=[%d %d]”), Range.GetLowerBound().GetValue().Value, Range.GetUpperBoundValue().Value );

TArray<UMovieSceneSection*> Sections = MovieScene->GetAllSections();

for (auto Section : Sections)
{
UE_LOG(LogTemp, Log, TEXT(“%s”), *Section->GetName());

Range = Section->GetRange();
UE_LOG(LogTemp, Log, TEXT(“Range=[%d %d]”), Range.GetLowerBound().GetValue().Value, Range.GetUpperBoundValue().Value);
}
}`

>・ルートのフレーム位置から、UMovieSceneSectionのフレームの位置

>・UMovieSceneSectionのフレーム位置から、ルートのフレームの位置

これらについてはセクションの開始位置を加算・減算することで換算できるかと思います。

よろしくお願いいたします。

ご返信ありがとうございます。

すみません。説明不足でした。

シーケンサーは階層構造になっていて、

SSの例で書くと3階層で、Sequence_01(Root) → Shot_01 → Actor になっております。

時間のカーソルは、すべてRootの0を指しています。

このデータで取りたい値は、Actor(Transform)の有効フレームとなり、その対応したRootのフレームで

Actor(Transform) 38~182

Sequence_01(Root) 0~144

となります。

[Image Removed]

補足情報をありがとうございます。

一連のスクリーンショットからは相互の位置関係を読み取りかねました。

階層構造を示す場合はシーケンサーの右上部分を含むスクリーンショットが適しているかもしれません。

お手数ではありますが、必要部分を切り出したプロジェクトを添付して頂けると状況の共有として最も確実です。

[Image Removed]

以下のような構造になっているものと推定しましたがこれで問題ないでしょうか(Sequence_01 が Root になっていませんのであまり自信はありません)。

LS_Root ( 再生範囲 0 ~ 1850 )

└ShotTrack ( セクション範囲 0 ~ 1850, Sequence_01 )

[Image Removed]

Sequence_01 ( 再生範囲 0 ~ 1850 )

└ShotTrack ( セクション範囲 0 ~ 144, Shot_01 )

[Image Removed]

Shot_01 ( 再生範囲 1938 ~ 2082 )

└Transform ( セクション範囲 1900 ~ 2244 )[Image Removed]

よろしくお願いいたします。

ご返信ありがとうございます。

階層構造はそのような構成で問題ありません。

実際のデータは5階層くらいありまして簡略していました。

また、上部にプラグインなどを配置していてSSを削っていました。

お手数をおかけいたします。

よろしくお願いいたします。

理屈としては以前の回答の通りでセクションの位置と再生範囲との関係を加算・減算して相対的な位置を得るくらいなのですが、

頂いた情報をふまえて 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()

のようにして取得できます。

よろしくお願いいたします。​