diff --git a/03-UnrealEngine/Sequence/Sequence Runtime Binding.md b/03-UnrealEngine/Sequence/Sequence Runtime Binding.md index e8fd103..b634663 100644 --- a/03-UnrealEngine/Sequence/Sequence Runtime Binding.md +++ b/03-UnrealEngine/Sequence/Sequence Runtime Binding.md @@ -6,6 +6,9 @@ tags: rating: ⭐ --- # 前言 +***MovieSceneTextTrack*** 引擎插件可以作为参考。 +***UMovieSceneCVarTrackInstance*** + 参考: 1. [sequencer mute tracks at runtime from c](https://forums.unrealengine.com/t/sequencer-mute-tracks-at-runtime-from-c/476278/3) @@ -60,6 +63,9 @@ UMovieSceneSequenceExtensions methods are not exported. They don’t have the PL - LevelSequence分析 - https://zhuanlan.zhihu.com/p/157892605 +## UMovieSceneTrackInstance +大部分Track的instance类。 + ## 继承关系 UMovieSceneSignedObject -> UObject。一个UMovieScene由若干个MasterTrack(UMovieSceneTrack)组成,UMovieScene相当于是UMovieSceneTracks的容器,那么UMovieSceneTrack又由UMovieSceneSections组成,UMovieSceneSection就是一个Track中间的某一段。 @@ -154,6 +160,83 @@ TArray FSequencerUtilities::AddActors(TSharedRef Sequencer, c } ``` +其他参考 +```c++ +const FGuid PossessableGuid = OwnerMovieScene->AddPossessable(InName, InObject.GetClass()); + +if (!OwnerMovieScene->FindPossessable(PossessableGuid)->BindSpawnableObject(Sequencer->GetFocusedTemplateID(), &InObject, &Sequencer.Get())) +{ + OwnerSequence->BindPossessableObject(PossessableGuid, InObject, BindingContext); +} +``` + +```c++ +FGuid FSequencerUtilities::CreateBinding(TSharedRef Sequencer, UObject& InObject, const FString& InName) +{ + const FScopedTransaction Transaction(LOCTEXT("CreateBinding", "Create New Binding")); + + UMovieSceneSequence* OwnerSequence = Sequencer->GetFocusedMovieSceneSequence(); + UMovieScene* OwnerMovieScene = OwnerSequence->GetMovieScene(); + + OwnerSequence->Modify(); + OwnerMovieScene->Modify(); + + const FGuid PossessableGuid = OwnerMovieScene->AddPossessable(InName, InObject.GetClass()); + + // Attempt to use the parent as a context if necessary + UObject* ParentObject = OwnerSequence->GetParentObject(&InObject); + UObject* BindingContext = Sequencer->GetPlaybackContext(); + + AActor* ParentActorAdded = nullptr; + FGuid ParentGuid; + + if (ParentObject) + { + // Ensure we have possessed the outer object, if necessary + ParentGuid = Sequencer->GetHandleToObject(ParentObject, false); + if (!ParentGuid.IsValid()) + { + ParentGuid = Sequencer->GetHandleToObject(ParentObject); + ParentActorAdded = Cast(ParentObject); + } + + if (OwnerSequence->AreParentContextsSignificant()) + { + BindingContext = ParentObject; + } + + // Set up parent/child guids for possessables within spawnables + if (ParentGuid.IsValid()) + { + FMovieScenePossessable* ChildPossessable = OwnerMovieScene->FindPossessable(PossessableGuid); + if (ensure(ChildPossessable)) + { + ChildPossessable->SetParent(ParentGuid, OwnerMovieScene); + } + + FMovieSceneSpawnable* ParentSpawnable = OwnerMovieScene->FindSpawnable(ParentGuid); + if (ParentSpawnable) + { + ParentSpawnable->AddChildPossessable(PossessableGuid); + } + } + } + + if (!OwnerMovieScene->FindPossessable(PossessableGuid)->BindSpawnableObject(Sequencer->GetFocusedTemplateID(), &InObject, &Sequencer.Get())) + { + OwnerSequence->BindPossessableObject(PossessableGuid, InObject, BindingContext); + } + + // Broadcast if a parent actor was added as a result of adding this object + if (ParentActorAdded && ParentGuid.IsValid()) + { + Sequencer->OnActorAddedToSequencer().Broadcast(ParentActorAdded, ParentGuid); + } + + return PossessableGuid; +} +``` + ### FAudioTrackEditor FAudioTrackEditor::HandleAssetAdded(UObject* Asset, const FGuid& TargetObjectGuid) => FAudioTrackEditor::AddNewSound() => UMovieSceneAudioTrack::AddNewSoundOnRow(USoundBase* Sound, FFrameNumber Time, int32 RowIndex) @@ -164,7 +247,8 @@ FAudioTrackEditor::HandleAssetAdded(UObject* Asset, const FGuid& TargetObjectGui - `TObjectPtr Animation` - FSkeletalAnimationTrackEditor - UMovieSceneSkeletalAnimationSystem -- ~~FSkeletalAnimationTrackEditMode~~ + - 里面有介绍System相关的逻辑 https://zhuanlan.zhihu.com/p/413151867 +- FSkeletalAnimationTrackEditMode Track的编辑器注册位于MovieSceneToolsModule.cpp: ```c++ @@ -337,6 +421,41 @@ void UMovieSceneSequencePlayer::UpdateMovieSceneInstance(FMovieSceneEvaluationRa } ``` +这段解析来自于:https://zhuanlan.zhihu.com/p/413151867 +```c++ +UMovieSceneSequencePlayer::Play() //蓝图中调用 +UMovieSceneSequencePlayer::PlayInternal() +UMovieSceneSequencePlayer::UpdateMovieSceneInstance +RootTemplateInstance.Evaluate(Context, *this); + +// FMovieSceneRootEvaluationTemplateInstance::Evaluate +EntitySystemRunner.Update(Context, RootInstanceHandle); + +FMovieSceneEntitySystemRunner::Flush() +FMovieSceneEntitySystemRunner::DoFlushUpdateQueueOnce() +FMovieSceneEntitySystemRunner::GameThread_ProcessQueue() +FMovieSceneEntitySystemRunner::GameThread_SpawnPhase() + +// FMovieSceneEntitySystemRunner::GameThread_SpawnPhase() +/// System Linker->GetInstanceRegistry(); +FInstanceRegistry* InstanceRegistry = GetInstanceRegistry(); +FSequenceInstance& Instance = InstanceRegistry->MutateInstance(Update.InstanceHandle); +Instance.Update(Linker, Update.Context); + +// FSequenceInstance::Update +SequenceUpdater->Update(Linker, Params, ComponentField, EntitiesScratch); + +// FSequenceUpdater_Flat::Update +FSequenceInstance& SequenceInstance = Linker->GetInstanceRegistry()->MutateInstance(InstanceHandle); +SequenceInstance.Ledger.UpdateEntities + +// FEntityLedger::UpdateEntities +FInstanceRegistry* InstanceRegistry = Linker->GetInstanceRegistry(); +ImportEntity(Linker, ImportParams, EntityField, Query); +} +``` + + 暂停的核心逻辑: ```c++ FMovieSceneEvaluationRange CurrentTimeRange = PlayPosition.GetCurrentPositionAsRange(); diff --git a/03-UnrealEngine/卡通渲染相关资料/渲染功能/其他参考/插画参考/星穹铁道-流萤-白丝.png b/03-UnrealEngine/卡通渲染相关资料/渲染功能/其他参考/插画参考/星穹铁道-流萤-白丝.png new file mode 100644 index 0000000..ae2174c Binary files /dev/null and b/03-UnrealEngine/卡通渲染相关资料/渲染功能/其他参考/插画参考/星穹铁道-流萤-白丝.png differ diff --git a/03-UnrealEngine/卡通渲染相关资料/渲染功能/其他参考/插画参考/未知_皮肤_室内.png b/03-UnrealEngine/卡通渲染相关资料/渲染功能/其他参考/插画参考/未知_皮肤_室内.png new file mode 100644 index 0000000..a50c7d3 Binary files /dev/null and b/03-UnrealEngine/卡通渲染相关资料/渲染功能/其他参考/插画参考/未知_皮肤_室内.png differ