Hi Karim,
Sorry about the extended delay. I understand you do not have Sequencer available at the time your generator runs. If you at least have access to instances of UMovieSceneSequence, which is the base class of ULevelSequence assets, you can do the following:
`void DeleteTaggedFromSequence (UMovieSceneSequence* MovieSceneSequence, FName Tag)
{
const TArray& BindingIds = MovieSceneSequence->FindBindingsByTag(Tag);
for (const FMovieSceneObjectBindingID& BindingId : BindingIds)
{
FMovieSceneBindingProxy BindingProxy = UMovieSceneSequenceExtensions::ResolveBindingID(MovieSceneSequence, BindingId);
const TArray& Children = UMovieSceneBindingExtensions::GetChildPossessables(BindingProxy);
for (FMovieSceneBindingProxy Child : Children)
UMovieSceneBindingExtensions::Remove(Child);
UMovieSceneBindingExtensions::Remove(BindingProxy);
}
}`The code above makes use of methods from classes UMovieSceneSequenceExtensions and UMovieSceneBindingExtensions, which were designed to help scripting the Editor and are unfortunately not DLL-exposed. However, for C++ usage, you can simply copy the body of the required methods, and everything should work correctly.
Now, if you must work with only UMovieScene and not UMovieSceneSequence, this can still be done for each movie scene independently, but I believe you won’t be able to access subsequence bindings correctly. Here is the code I used here in a test project:
`TArray GetChildPossessables(UMovieScene* MovieScene, const FGuid& InBinding)
{
TArray Result;
if (MovieScene)
{
FMovieSceneSpawnable* Spawnable = MovieScene->FindSpawnable(InBinding);
if (Spawnable)
{
for (const FGuid& ChildGuid : Spawnable->GetChildPossessables())
{
Result.Add(ChildGuid);
}
return Result;
}
const int32 Count = MovieScene->GetPossessableCount();
for (int32 i = 0; i < Count; ++i)
{
FMovieScenePossessable& PossessableChild = MovieScene->GetPossessable(i);
if (PossessableChild.GetParent() == InBinding)
{
Result.Add(PossessableChild.GetGuid());
}
}
}
return Result;
}
void DeleteTaggedFromScene (UMovieScene* MovieScene, FName Tag)
{
const FMovieSceneObjectBindingIDs* BindingIDs = MovieScene->AllTaggedBindings().Find(Tag);
if (!BindingIDs)
return;
for (const FMovieSceneObjectBindingID& BindingId : BindingIDs->IDs)
{
if (BindingId.GetRelativeSequenceID() != MovieSceneSequenceID::Root)
continue;
TArray Children = GetChildPossessables(MovieScene, BindingId.GetGuid());
for (const FGuid& Child : Children)
{
if (!MovieScene->RemovePossessable(Child))
MovieScene->RemoveSpawnable(Child);
}
if (!MovieScene->RemovePossessable(BindingId.GetGuid()))
MovieScene->RemoveSpawnable(BindingId.GetGuid());
}
}`In both snippets above, functions GetChildPossessables() are responsible for getting the component bindings parented to an object that is tagged for deletion. Then, removal of possessables and spawnables should also clear their other tracks.
Please let me know if one of these solutions work for you, and feel free to ask if you still have any difficulty.
Best regards,
Vitor