2024-05-16 17:18:33 +08:00
|
|
|
|
# 前言
|
2024-05-24 17:55:01 +08:00
|
|
|
|
继承关系:BP_XXX_Base -> BP_Idol_Base -> TsIdolActor -> AVCharacter -> ACharacter 。
|
2024-05-16 17:18:33 +08:00
|
|
|
|
主要逻辑位于TsIdolActor中,文件路径为`Script/LiveDirector/Character/TsIdolActor.ts`
|
|
|
|
|
|
2024-05-24 18:21:55 +08:00
|
|
|
|
# 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信息
|
2024-05-16 17:18:33 +08:00
|
|
|
|
|
2024-05-24 18:21:55 +08:00
|
|
|
|
# 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)
|
|
|
|
|
}
|
|
|
|
|
```
|