3.8 KiB
3.8 KiB
title, date, excerpt, tags, rating
title | date | excerpt | tags | rating |
---|---|---|---|---|
Sequence Runtime Binding | 2024-05-16 17:55:58 | ⭐ |
前言
参考:
方案一
- UMovieSceneTrack::SetEvalDisabled(bool)
- ULevelSequence::MarkAsChanged()
- MovieSceneCompiledDataManager::GetPrecompiledData()->Compile(ULevelSequence*)
// You first have to set the unwanted track as disabled via
void YourDisableTrackFunction(UMovieSceneTrack* MovieSceneTrack, bool Value)
{
if (MovieSceneTrack)
{
MovieSceneTrack->SetEvalDisabled(Value);
}
}
// Then notify the sequencer that the tracks have been modified using MarkAsChanged and UMovieSceneCompiledDataManager::GetPrecompiledData()->Compile.
void YourMarkAsChangedFunction(ULevelSequence* Sequence)
{
if (Sequence)
{
Sequence->MarkAsChanged();
if (UMovieSceneCompiledDataManager::GetPrecompiledData())
{
UMovieSceneCompiledDataManager::GetPrecompiledData()->Compile(Sequence);
}
}
}
方案二
UMovieSceneSequenceExtensions methods are not exported. They don’t have the PLUGIN_API macro in the class, so you can’t link to them. Someone on discord said you can copy the plugin into your own project and add your own API macro and rebuild, but seems like a bit of work.
#include "LevelSequencePlayer.h" #include "MovieSceneSequencePlaybackSettings.h" #include "DefaultLevelSequenceInstanceData.h" #include "LevelSequenceActor.h" void UMyAnimInstance::StartSequence_Implementation() { FMovieSceneSequencePlaybackSettings Settings; ALevelSequenceActor *SequenceActor = nullptr; ULevelSequencePlayer* player = ULevelSequencePlayer::CreateLevelSequencePlayer(this, this->MySequence, Settings, SequenceActor); check(player); check(SequenceActor); SequenceActor->bOverrideInstanceData = 1; UDefaultLevelSequenceInstanceData* InstanceData = Cast<UDefaultLevelSequenceInstanceData>(SequenceActor->DefaultInstanceData.Get()); InstanceData->TransformOrigin = this->GetOwningActor()->GetActorTransform(); UMovieScene* MovieScene = this->MySequence->GetMovieScene(); check(MovieScene); const FMovieSceneBinding* Binding = Algo::FindBy(MovieScene->GetBindings(), FString("SequencerActor"), &FMovieSceneBinding::GetName); check(Binding); EMovieSceneObjectBindingSpace Space = EMovieSceneObjectBindingSpace::Root; FMovieSceneObjectBindingID BindingID = UE::MovieScene::FRelativeObjectBindingID(Binding->GetObjectGuid()); // Not sure about this if (Space == EMovieSceneObjectBindingSpace::Root) { BindingID.ReinterpretAsFixed(); } SequenceActor->AddBinding(BindingID, this->GetOwningActor()); player->Play(); // Save actor and player in properties this->SequencerActor = SequenceActor; this->SequencerPlayer = player; }
自定义Track
- Runtime修改绑定
- UE4:扩展Sequencer的BakeTransform有关Camera的参数:https://zhuanlan.zhihu.com/p/554484287
- LevelSequence对象绑定分析:https://zhuanlan.zhihu.com/p/548155341
- 自定义Track
继承关系
UMovieSceneSignedObject -> UObject
UMovieSceneSignedObject
子类有UMovieScene、UMovieSceneSequence、UMovieSceneTrack、UMovieSceneSection。 定义:
- FGuid Signature:用于确定Object身份,以便于绑定。
- FOnSignatureChanged OnSignatureChangedEvent:ChangedEvent。
UMovieSceneSection
UMovieSceneSkeletalAnimationSection
UMovieSceneTrack
UMovieSceneSkeletalAnimationTrack
TArray<TObjectPtr<UMovieSceneSection>> AnimationSections
:存储所有动画Section。- FMovieSceneSkeletalAnimRootMotionTrackParams RootMotionParams:RootMotion控制。
编辑器代码:FSkeletalAnimationTrackEditor