お世話になっております。
元投稿に添付いただいたコードの形に近いやり方で実装したものも用意しました(出力はすべてのバインディングされたオブジェクトとしています)ので、何かの参考になれば幸いです。
これをブループリント関数ライブラリとして実装したサンプルプロジェクトも添付いたしました。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);
}
}
}
}
}
}`以上、よろしくお願いいたします。