From c723614d2ec9cd32f2d54726b0607978b2be51bc Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Fri, 24 May 2024 17:55:01 +0800 Subject: [PATCH 1/2] vault backup: 2024-05-24 17:55:00 --- 02-Note/DAWA/ASoul/流程笔记/角色流程.md | 2 +- .../Sequence/Sequence Runtime Binding.md | 41 +------------------ 2 files changed, 2 insertions(+), 41 deletions(-) diff --git a/02-Note/DAWA/ASoul/流程笔记/角色流程.md b/02-Note/DAWA/ASoul/流程笔记/角色流程.md index 8d98393..db258dd 100644 --- a/02-Note/DAWA/ASoul/流程笔记/角色流程.md +++ b/02-Note/DAWA/ASoul/流程笔记/角色流程.md @@ -1,5 +1,5 @@ # 前言 -继承关系:BP_XXX_Base -> BP_Idol_Base -> TsIdolActor -> AVCharacter -> Character 。 +继承关系:BP_XXX_Base -> BP_Idol_Base -> TsIdolActor -> AVCharacter -> ACharacter 。 主要逻辑位于TsIdolActor中,文件路径为`Script/LiveDirector/Character/TsIdolActor.ts` # 角色判断逻辑 diff --git a/03-UnrealEngine/Sequence/Sequence Runtime Binding.md b/03-UnrealEngine/Sequence/Sequence Runtime Binding.md index 0339ce0..e0b78fe 100644 --- a/03-UnrealEngine/Sequence/Sequence Runtime Binding.md +++ b/03-UnrealEngine/Sequence/Sequence Runtime Binding.md @@ -26,41 +26,6 @@ rating: ⭐ 2. [x] 使用Sequence的EventTrack设置若干事件。 3. 模改UMovieSceneSkeletalAnimationTrack,实现一个可以自动根据Tag捕获对应角色并且播发动画的功能。 -# 方案一 -- UMovieSceneTrack::SetEvalDisabled(bool) -- ULevelSequence::MarkAsChanged() -- MovieSceneCompiledDataManager::GetPrecompiledData()->Compile(ULevelSequence*) -```c++ -// 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. -```c++ -#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(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 @@ -497,12 +462,8 @@ SequenceRecorder模块的基类是ISequenceRecorder。 - 控制和数据流是非常线性的,没有循环或递归的依赖性(也就是说,没有一种逻辑会要求重新计算已经计算出的数值)。 - 只有初始设置和最终属性设置器才有线程限制。 - -TODO: -1. https://www.unrealengine.com/marketplace/zh-CN/product/blueprintsequencertrack -2. - 可参考Tracker实现: +- https://www.unrealengine.com/marketplace/zh-CN/product/blueprintsequencertrack - GeometryCacheTracks & GeometryCacheSequencer - MovieSceneEventTrack - MovieSceneEventSection From 2bc50c5d4759c6f81a59cef3333b4b10e3572c5e Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Fri, 24 May 2024 18:21:55 +0800 Subject: [PATCH 2/2] vault backup: 2024-05-24 18:21:54 --- 02-Note/DAWA/ASoul/导播操作笔记.md | 1 + 02-Note/DAWA/ASoul/流程笔记/角色流程.md | 29 ++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/02-Note/DAWA/ASoul/导播操作笔记.md b/02-Note/DAWA/ASoul/导播操作笔记.md index aea6961..0f5a141 100644 --- a/02-Note/DAWA/ASoul/导播操作笔记.md +++ b/02-Note/DAWA/ASoul/导播操作笔记.md @@ -362,6 +362,7 @@ public: 1. DirectorCam:与24个镜头相关。 2. Editor:RuntimeEditor相关。 3. LiveDirector: + 1. [ ] Character/TsIdolActor.ts:[[角色流程#TsIdolActor.ts]] 4. Camera 5. Characrer: 6. Danma:弹幕相关,View以及控制。 diff --git a/02-Note/DAWA/ASoul/流程笔记/角色流程.md b/02-Note/DAWA/ASoul/流程笔记/角色流程.md index db258dd..749be28 100644 --- a/02-Note/DAWA/ASoul/流程笔记/角色流程.md +++ b/02-Note/DAWA/ASoul/流程笔记/角色流程.md @@ -2,7 +2,30 @@ 继承关系:BP_XXX_Base -> BP_Idol_Base -> TsIdolActor -> AVCharacter -> ACharacter 。 主要逻辑位于TsIdolActor中,文件路径为`Script/LiveDirector/Character/TsIdolActor.ts` -# 角色判断逻辑 -PropTags: UE.GameplayTagContainer +# AVCharacter +主要实现了`virtual void OnRep_AttachmentReplication() override;`,声明了若干BlueprintNativeEvent: +- bool CanSyncRelativeTransform(); +- void BeforeAttachToNewParent(); +- void AfterAttachToNewParent(); + +## OnRep_AttachmentReplication() +注释: +>// 动捕模式下,CanSync=false. 各端自行计算Actor Location, client无需使用Server计算结果 + // 自由行走模式下, CanSync=true,client需要同步server的transform信息 -通过Tag判断。 \ No newline at end of file +# TsIdolActor.ts +## VirtualOverrider + +```typescript +CanSyncRelativeTransform(): boolean { + if (Utils.HasTag(this.PropTags, new UE.GameplayTag("Idol.AIACao"))) { + return false; + } + if(this.MovementComp && this.MovementComp.ManulMovement){ + return false + } + var animInstance = this.Mesh.GetAnimInstance() as UE.IdolAnimInstance + let fullbodyNode = Reflect.get(animInstance, 'AnimGraphNode_Fullbody') as UE.AnimNode_FullBody + return !(fullbodyNode && fullbodyNode.bGetMotionData) +} +``` \ No newline at end of file