シーケンサー上のトラックにバインドしたオブジェクトの検索について

シーケンサー上のイベントトラックに、イベントトリガーを配置

(BPをドラッグアンドドロップ)して、イベントの制御をしております。

この時、シーケンサー再生開始時に、イベントトラック上の全てのバインドされた

イベントトリガーの情報を取得したいと思って調べておりました。

ひとまず、添付したコードのように、シーケンサー内のトラックを再起的に

検索しながら、バインドされたオブジェクトを検出することで、

バインドされたオブジェクトの名前は、取得することができました。

しかしながら、

LevelSequencePlayer->GetBoundObjects(BindingID)

によって、バインドされたオブジェクトのUObjectを取得しようとしたところ、

ルートの階層のものは取得できたものの、階層構造の奥のものは、なぜか

取得することができておりません。

(バインドされたオブジェクトとして、名前などは問題なく取得できております)

複数のレベルシーケンスが階層構造になっているので、階層の奥にある別の

レベルシーケンスにバインドされたオブジェクトについては、何かしら取得するための

条件があるのかと思いまして調べていたのですが、特に有益な情報が見つからないので、

こちらで質問をさせて頂ければと思います。

ということで、質問なのですが、

シーケンサー上のイベントトラックに、イベントトリガーを配置

(BPをドラッグアンドドロップ)した場合に、シーケンサー開始時に

それらのイベントトリガーについて、

LevelSequencePlayer->GetBoundObjects()

などを使用して、UObjectを取得したいのですが

どのようにすればよいでしょうか?

また、以下に添付したコードで、イベントトラックにバインドされた

オブジェクトのUObjectは、取れそうには思っているのですが、

(現在は該当箇所は#if 0で囲ってあります)

何かしら足りない部分があったりしますでしょうか?

(ちなみに、ルートのUObjectは問題なく取れておりまして、

階層構造の中の別のレベルシーケンスにバインドされた

イベントトリガーのUObjectが取れておりません)

お手数をおかけしますがよろしくお願いいたします。

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

ご質問ありがとうございます。

関連性の高い質問がEPS(UDN)に投稿&解決されておりましたので、こちらで取り上げられていたアプローチでご要件を解決できるかどうか、一度ご確認いただけますと幸いです。

[Content removed]

以上、よろしくお願いいたします。

ご回答ありがとうございます。

確認致します。

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

元投稿に添付いただいたコードの形に近いやり方で実装したものも用意しました(出力はすべてのバインディングされたオブジェクトとしています)ので、何かの参考になれば幸いです。

これをブループリント関数ライブラリとして実装したサンプルプロジェクトも添付いたしました。PIEを実行すると、サブシーケンスも再帰的に探索して、クラス型などを打ち出せておりますので、オブジェクト本体が取得できているという認識です。こちらで問題がないかご確認いただけますでしょうか。

(Spawnableタイプのオブジェクトはシーケンサー​を再生開始しなければ取得できないため、サンプルではレベルブループリントにおいてシーケンサーの再生開始→取得操作開始、の順で処理しています)​

`/* MyProject.Build.csに"MovieScene", "MovieSceneTracks"モジュールの依存性追加が必要 */

void USequencerBindingHelper::GetAllBoundObjectsRecursive(ULevelSequencePlayer* LevelSequencePlayer, ULevelSequence* RootSequence, TArray<UObject*>& OutObjects)
{
if (!LevelSequencePlayer || !RootSequence) { return; }

GetAllBoundObjectsRecursive_Internal(LevelSequencePlayer, RootSequence->GetMovieScene(), MovieSceneSequenceID::Root, OutObjects);
}

void USequencerBindingHelper::GetAllBoundObjectsRecursive_Internal(ULevelSequencePlayer* LevelSequencePlayer, UMovieScene* MovieScene, FMovieSceneSequenceID SequenceID, TArray<UObject*>& OutObjects)
{
if (!MovieScene)
{
return;
}

// すべてのオブジェクトバインディングを取得
const TArray& Bindings = MovieScene->GetBindings();
for (const FMovieSceneBinding& Binding : Bindings)
{
// バインディングのGUIDを取得
FGuid BindingGuid = Binding.GetObjectGuid();

FMovieSceneObjectBindingID BindingID = UE::MovieScene::FFixedObjectBindingID(BindingGuid, SequenceID);
const TArray<UObject*> BoundObjects = LevelSequencePlayer->GetBoundObjects(BindingID);
for (UObject* BoundObject : BoundObjects)
{
OutObjects.Add(BoundObject);
}
}

// シーケンサー内のすべてのトラックを取得
const TArray<UMovieSceneTrack*>& Tracks = MovieScene->GetTracks();
for (UMovieSceneTrack* Track : MovieScene->GetTracks())
{
if (UMovieSceneSubTrack* SubTrack = Cast(Track))
{
const TArray<UMovieSceneSection*>& Sections = SubTrack->GetAllSections();
for (UMovieSceneSection* Section : Sections)
{
if (UMovieSceneSubSection* SubSection = Cast(Section))
{
// サブセクションが参照しているレベルシーケンスを取得
UMovieSceneSequence* SubSequence = SubSection->GetSequence();
if (SubSequence)
{
const FMovieSceneSequenceID SubID = LevelSequencePlayer->State.FindSequenceId(SubSequence);

// 再帰呼び出し
GetAllBoundObjectsRecursive_Internal(LevelSequencePlayer, SubSequence->GetMovieScene(), SubID, OutObjects);
}
}
}
}
}
}`​以上、よろしくお願いいたします。

ご教示ありがとうございます。

大変助かります。

サンプルソースを試してみたいと思います。

上記のサンプルソースを使用して、無事、階層構造の中の

バインドされたオブジェクトを取得することができました。

ご教示ありがとうございました。

お忙しいなか、ご確認ありがとうございました。

それでは本スレッドは回答済みとしてCloseさせていただきます。

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