Merge remote-tracking branch 'origin/master'
# Conflicts: # 03-UnrealEngine/Sequence/Sequence Runtime Binding.md
This commit is contained in:
commit
d76c9c0d04
@ -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<FGuid> FSequencerUtilities::AddActors(TSharedRef<ISequencer> 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<ISequencer> 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<AActor>(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<UAnimSequenceBase> 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();
|
||||
|
BIN
03-UnrealEngine/卡通渲染相关资料/渲染功能/其他参考/插画参考/星穹铁道-流萤-白丝.png
Normal file
BIN
03-UnrealEngine/卡通渲染相关资料/渲染功能/其他参考/插画参考/星穹铁道-流萤-白丝.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1016 KiB |
BIN
03-UnrealEngine/卡通渲染相关资料/渲染功能/其他参考/插画参考/未知_皮肤_室内.png
Normal file
BIN
03-UnrealEngine/卡通渲染相关资料/渲染功能/其他参考/插画参考/未知_皮肤_室内.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 MiB |
Loading…
x
Reference in New Issue
Block a user