お世話になっております。
<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関数も確認したいと思います。
この質問はクローズで問題ございません。
ご対応ありがとうございました。