階層構造のLevelSequenceにバインドされたActorを取得する方法

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

<br/>

以下の階層構造になっているレベルシーケンスにおいて

親LS(UMovieSceneSequence)から孫LSでバインドされているアクターを取得したいのですが

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

// レベルシーケンスの階層構造 親LS └─(Shot)─ 子LS └─(Shot)─ 孫LS └─(Spawnable)─ アクター<br/>

以下のようにFindBoundObjects()を試したのですが、子LSにあるアクターは取得できるものの、孫LSにあるアクターを取得することはできませんでした。何かわかることがあればご教示いただけますと幸いです。

`// Find in subsequences
// UMovieSceneSequence* InSequence ※親LS or 子LS
// IMovieScenePlayer& InPlayer
UMovieScene* MovieScene = InSequence->GetMovieScene();
for (const UMovieSceneTrack* Track : MovieScene->GetTracks())
{
const UMovieSceneSubTrack* SubTrack = Cast(Track);
if (!SubTrack || SubTrack->IsEvalDisabled())
{
continue;
}

for (const UMovieSceneSection* Section : SubTrack->GetAllSections())
{
const UMovieSceneSubSection* SubSection = Cast(Section);
if (!SubSection)
{
continue;
}

UMovieSceneSequence* SubSequence = SubSection->GetSequence();
if (!SubSequence)
{
continue;
}

UMovieScene* SubMovieScene = SubSequence->GetMovieScene();
if (!SubMovieScene)
{
continue;
}

const TArray& Bindings = SubMovieScene->GetBindings();
for (const FMovieSceneBinding& Binding : Bindings)
{
FGuid Guid = Binding.GetObjectGuid();
TArrayView<TWeakObjectPtr<>> BoundObjects = InPlayer.FindBoundObjects(Guid, SubSection->GetSequenceID());
}
}
}`以上、よろしくお願い致します。

こちら自己解決致しました。

FindBoundObjects()にSubSection->GetSequenceID()を直接渡すのではなく、ResolveChildSequenceID()をはさむことでアクターを取得できました。

// InSequenceID ショットがあるシーケンスのID UE::MovieScene::FSubSequencePath RootPath(InSequenceID, InPlayer); FMovieSceneSequenceID ResolvedSequenceID = RootPath.ResolveChildSequenceID(SubSection->GetSequenceID()); FGuid Guid = Binding.GetObjectGuid(); TArrayView<TWeakObjectPtr<>> BoundObjects = InPlayer.FindBoundObjects(Guid, ResolvedSequenceID);​問題などございましたら、ご指摘のほどよろしくお願い致します。

特に実装に問題はございませんが、入力されたレベルシーケンスの階層構造を捜査するVisitSequence関数があり、ObjectBindingに対してコールバックを呼び出すことができます。

サンプルコードは以下の通りです。​

`struct FSequenceListBoundObjectVisitor : UE::MovieScene::ISequenceVisitor
{
IMovieScenePlayer* Player;
public:
FSequenceListBoundObjectVisitor(IMovieScenePlayer* InPlayer) :Player(InPlayer) {}
virtual void VisitObjectBinding(const FMovieSceneBinding& Binding, const UE::MovieScene::FSubSequenceSpace& LocalSpace)
{
FGuid Guid = Binding.GetObjectGuid();
TArrayView<TWeakObjectPtr<>> BoundObjects = Player->FindBoundObjects(Guid, LocalSpace.SequenceID);
//DoSomething
}
};

UE::MovieScene::FSequenceVisitParams Params;
Params.bVisitSubSequences = true;
Params.bVisitObjectBindings = true;
FSequenceListBoundObjectVisitor ListBoundObjectVisitor(InPlayer);
VisitSequence(InSequence, Params, ListBoundObjectVisitor);`​

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

問題ない旨、承知致しました。

ご教示いただきましたVisitSequence関数も確認したいと思います。

この質問はクローズで問題ございません。

ご対応ありがとうございました。