241 lines
11 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# TsScreenPlayerTextureRenderer
   - MultiViewActor: UE.MultiViewActor;// 用于渲染pvw/pgm画面
- ReceiveBeginPlay() =>
- this.RegisterLocalEventListener(); =>
- this.ChangeCameraTask(TaskData);
## RegisterLocalEventListener
```ts
private RegisterLocalEventListener(): void {
this.PVWCameraChangeFunc = (TaskData: UE.CamTaskDataRPC) => {
if (this.CurTag == DirectorMode.PVWCameraRenderer) {
this.ChangeCameraTask(TaskData);
}
}
this.PGMCameraChangeFunc = (TaskData: UE.CamTaskDataRPC) => {
if (this.CurTag == DirectorMode.PGMCameraRenderer) {
this.ChangeCameraTask(TaskData);
}
}
this.SwitchDirectorNetTagFunc = (oldTag: UE.GameplayTag, newTag: UE.GameplayTag) => {
this.SwitchDirectorNetTagCallback(oldTag, newTag);
}
DirectorEventSystem.RegisterEventListener(this, DirectorEvent.OnPVWTaskRequested, this.PVWCameraChangeFunc);
DirectorEventSystem.RegisterEventListener(this, DirectorEvent.OnPGMTaskRequested, this.PGMCameraChangeFunc);
DirectorEventSystem.RegisterEventListener(this, DirectorEvent.SwitchDirectorMode, this.SwitchDirectorNetTagFunc)
}
```
## ChangeCameraTask
```ts
ChangeCameraTask(TaskData: UE.CamTaskDataRPC) {
if(!this.bStarted){
return;
}
if(this.DirectorCamManagerActor == null){
this.DirectorCamManagerActor = this.GetCameraManagerActor();
}
// double check
if(this.DirectorCamManagerActor == null){
return;
}
if (this.Task) {
this.Task.Stop();
}
this.Task = DirectorCamUtil.CreateCamTask(this, TaskData, CamTaskType.FullStream, this.DirectorCamManagerActor.droneCamera, null, this.DirectorCamManagerActor.handHeldCamera)
if (this.Task) {
this.Task.Start()
this.BindCamera(this.Task.TryGetBindedMainCamera());
}
}
```
# DirectorCamGroup.cpp
```c++
UDirectorSequencePlayer* UDirectorCamGroup::GetDirectorSequencePlayerFromPool(int CamIndex, bool IsPreview)
{
TargetPlayer = NewObject<UDirectorSequencePlayer>(this);
TargetPlayer->SetCamSequence(CamIndex, SequenceActor);
if(IsPreview)
{
CachedPreviewingPlayer.AddUnique(TargetPlayer);
}
else
{
CachedStreamingPlayer.AddUnique(TargetPlayer);
}
}
```
# PVW & PGM红框效果代码 TsDirectorCamManagerActor.ts
```
//客户机加入流程:
//连接Server->同步当前场景->场景加载完成后收到本地事<E59CB0>?->初始化workShop
//->确认机器身份,执行本机任务(异步任务处理流程)
//异步处理流程:根据机器的性能,加入时间不同,状态差异自适应处理任务逻辑
// 服务端收到任务请<E58AA1>?->确保服务端的workShop初始化完<E58C96>?->处理数据及同<E58F8A>??
// ->客户机收到同步数据后->等待自己的workshop初始化完<E58C96>?->处理自己的逻辑
// 同一种任务只处理最近一<E8BF91>?
```
## HandlePreStreamTaskByNetTag()
相关切区域与切镜代码会调用RequestPVWTaskServer()
RequestPVWTaskServer() =>
RequestPVWTask() => HandlePreStreamTaskDataMulticast() => HandlePreStreamTaskByNetTag()
```ts
HandlePreStreamTaskByNetTag(): void {
if (this.prestreamTaskData) {
switch (Utils.GetDirectorMode(this).TagName) {
case DirectorMode.PVWAndPGM:
if(!DirectorCamUtil.SubmitNewCommandIfDataNotChanged(this.preStreamTask, this.prestreamTaskData)){
if (this.preStreamTask) {
this.preStreamTask.Stop()
}
this.preStreamTask = DirectorCamUtil.CreateCamTask(this, this.prestreamTaskData, CamTaskType.FullStream, this.droneCamera,
this.PVWWindow, this.handHeldCamera)
if (this.preStreamTask) {
this.preStreamTask.Start()
if (this.PVWWindow) {
this.PVWWindow.SetViewBorderColor(0, new UE.LinearColor(0, 1, 0, 1))
}
console.log('PVW Task:' + this.preStreamTask.workShop.BindPlacement.Title + " " + this.preStreamTask.groupName + " " +
this.preStreamTask.camName)
}
}
break
case DirectorMode.Preview:
this.RefreshWindowViewBorderColor()
break
case DirectorMode.PVW:
this.HandlePVWTask()
break;
default:
break
}
}
}
```
# 130mm Bug日志
```c++
[2024.08.06-05.08.09:625][373]Puerts: (0x00000703D1DF42D0) request PVW: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:9223AA8A478BA88F1217CD86911EDAE1, Index=0, StartFrame:0
[2024.08.06-05.08.09:626][373]LogLevelSequence: Starting new camera cut: 'Cam_TalkShowZuo_ZhuJiWei24mm_1'
[2024.08.06-05.08.09:626][373]Puerts: (0x00000703D1DF42D0) 设置相机目标:
[2024.08.06-05.08.09:626][373]Puerts: (0x00000703D1DF42D0) PVW Task: 线下 站\n4 ZhuJiWei24mm
[2024.08.06-05.08.11:550][487]Puerts: Warning: (0x00000703D1DF42D0) PauseOrResumeAllFxProp ,true
[2024.08.06-05.08.11:551][487]Puerts: Warning: (0x00000703D1DF42D0) PauseOrResumeAllFxProp ,false
[2024.08.06-05.08.11:551][487]LogChaosBone: Display: ResetDynamics: 1, ChaosBoneAssets Name: CBA_SK_JiaRan_Costume_BHair
[2024.08.06-05.08.11:551][487]LogChaosBone: Display: ResetDynamics: 1, ChaosBoneAssets Name: CBA_SK_JiaRan_Costume_dress
[2024.08.06-05.08.11:602][490]Puerts: Warning: (0x00000703D1DF42D0) BP_JiaRan_Costume_C_0 set visible false
[2024.08.06-05.08.11:602][490]Puerts: Warning: (0x00000703D1DF42D0) teleport to livearea 031D1C1742D7EB4C76F6B397FF404FD8
[2024.08.06-05.08.11:602][490]Puerts: Warning: (0x00000703D1DF42D0) PauseOrResumeAllFxProp ,true
[2024.08.06-05.08.11:602][490]Puerts: (0x00000703D1DF42D0) X=0.000 Y=0.000 Z=0.000
[2024.08.06-05.08.11:602][490]Puerts: Warning: (0x00000703D1DF42D0) PauseOrResumeAllFxProp ,false
[2024.08.06-05.08.11:602][490]Puerts: (0x00000703D1DF42D0) BP_JiaRan_Costume_C_0,attach prop ,玩具水枪A
[2024.08.06-05.08.11:603][490]Puerts: Warning: (0x00000703D1DF42D0) get socket of JiaRan: RightHandSocket
[2024.08.06-05.08.11:604][490]Puerts: (0x00000703D1DF42D0) Attach prop 玩具水枪A
[2024.08.06-05.08.11:604][490]Puerts: (0x00000703D1DF42D0) Idol.JiaRan successfully switch to 031D1C1742D7EB4C76F6B397FF404FD8
[2024.08.06-05.08.12:085][519]Puerts: Error: (0x00000703D1DF42D0) OnFinishDisappearFx(), but the idol visibility is true!!BP_JiaRan_Costume_C_0
[2024.08.06-05.08.12:107][520]Puerts: Warning: (0x00000703D1DF42D0) BP_JiaRan_Costume_C_0 set visible true
[2024.08.06-05.08.12:108][520]LogBlueprintUserMessages: [BP_JiaRan_Costume_C_0] Apply Material. Oringinal Material: false
[2024.08.06-05.08.12:108][520]Puerts: (0x00000703D1DF42D0) RefreshSceneCaptureShowList
[2024.08.06-05.08.12:109][520]Puerts: (0x00000703D1DF42D0) CheckItemFxPool, size 0
[2024.08.06-05.08.12:109][520]Puerts: (0x00000703D1DF42D0) TriggerHandPose
[2024.08.06-05.08.12:109][520]Puerts: (0x00000703D1DF42D0) TriggerHandPose
[2024.08.06-05.08.12:109][520]Puerts: Warning: (0x00000703D1DF42D0) Disable instrument pose
[2024.08.06-05.08.12:109][520]Puerts: (0x00000703D1DF42D0) Detect hand pose ToyGun
[2024.08.06-05.08.12:109][520]Puerts: (0x00000703D1DF42D0) TriggerHandPose ToyGun
[2024.08.06-05.08.12:455][541]Puerts: (0x00000703D1DF42D0) request PGM: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:9223AA8A478BA88F1217CD86911EDAE1, Index=0, StartFrame:0 , PushMethod =0
[2024.08.06-05.08.12:805][562]Puerts: (0x00000703D1DF42D0) request PGM: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:9223AA8A478BA88F1217CD86911EDAE1, Index=0, StartFrame:0 , PushMethod =0
[2024.08.06-05.08.14:606][670]LogBlueprintUserMessages: [BP_JiaRan_Costume_C_0] Apply Material. Oringinal Material: true
[2024.08.06-05.08.15:822][743]Puerts: (0x00000703D1DF42D0) request PVW: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:DDB1F27A44E7E5B312830A828EB55464, Index=0, StartFrame:0
[2024.08.06-05.08.15:823][743]LogLevelSequence: Starting new camera cut: 'Cine_Camera_Actor_1'
[2024.08.06-05.08.15:823][743]Puerts: (0x00000703D1DF42D0) 设置相机目标:
[2024.08.06-05.08.15:824][743]Puerts: (0x00000703D1DF42D0) PVW Task: 线下 贝拉2024生日 lengthtest
[2024.08.06-05.08.15:824][743]LogBlueprintUserMessages: [BP_Cine_Cam_FOV_1] 35.0
[2024.08.06-05.08.16:256][769]LogBlueprintUserMessages: [BP_Cine_Cam_FOV_1] 35.002922
```
相关Log顺序
- request PVW: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:DDB1F27A44E7E5B312830A828EB55464, Index=0, StartFrame:0
- LogLevelSequence: Starting new camera cut: 'Cine_Camera_Actor_1'
- Puerts: 设置相机目标:
- Puerts: PVW Task: 线下 贝拉2024生日 lengthtest
- PrintString BP_Cine_Cam_FOV_1 35.0
***HandlePVWTask中的prestreamTaskData 不对***
```c
// 播放指定相机到PVW.
@ufunction.ufunction(ufunction.ServerAPI, ufunction.Reliable)
PlayCamSequenceOnPVWServer(camGroupId:UE.Guid, camIndex:number):void{
let shotExists = this.directorCamSubSystem.ShotExistInGroup(this.prestreamTaskData.WorkShopId, camGroupId, camIndex)
if (shotExists || camIndex == DirectorCamUtil.DRONE_CAM_INDEX || camIndex == DirectorCamUtil.HANDHELD_CAM_INDEX) {
let newPVWTaskData = DirectorCamUtil.CopyTaskData(this.prestreamTaskData)
newPVWTaskData.CamGroupId = camGroupId
newPVWTaskData.CamIndex = camIndex
newPVWTaskData.StartFrame = 0
newPVWTaskData.bPreviewOneFrame = false
this.RequestPVWTaskServer(newPVWTaskData)
}
else {
console.warn('当前镜头不存<E4B88D>?,切换无效!index=' + camIndex)
}
}
class TsDirectorCamSequencePlayBridge extends UE.Actor {
    PlayCamSequence(camGroupId:UE.Guid, camIndex:number): void {
        let camManager = TsDirectorCamManagerActor.Get(this);
        if (camManager) {
            camManager.PlayCamSequenceOnPVWServer(camGroupId, camIndex);
        }
    }
}
```
```c++
// 切换到当前直播区域中的多个workShop
SwitchWorkShopInAreaServer(index: number): void {
// [Server]监听到场景模块切换了直播区域后自动切换<E58887>?0个workshop当前切换事件用来切换当前直播区域中的多个workshop
let levelControl = this.GetLevelAreaManager()
let liveArea = levelControl.GetCurrentLiveArea()
if (!liveArea) {
console.error('DirectorCamManager@ cannot find LiveAreaBy id')
return
}
let placement = DirectorCamUtil.GetPlacementInCurLiveArea(index, liveArea)
if (!placement) {
console.error('DirectorCamManager@SwitchWorkShopEvent:GetPlacementInCurLiveArea failed')
return
}
let GroupData = DirectorCamUtil.GetDefaultGroupData(this, placement.UUID)
if (GroupData) {
// 预览切换workShop后播放第一个分<E4B8AA>?
let newPreviewTaskData = new UE.CamTaskDataRPC()
newPreviewTaskData.WorkShopId = DirectorCamUtil.CopyGuid(placement.UUID)
newPreviewTaskData.CamGroupId = DirectorCamUtil.CopyGuid(GroupData.UUID)
newPreviewTaskData.CamIndex = 0
newPreviewTaskData.OperationId = this.previewTaskData.OperationId + 1
newPreviewTaskData.StartFrame = 0
newPreviewTaskData.bPreviewOneFrame = false
this.HandlePreviewTaskDataMulticast(newPreviewTaskData);
// 预推流切换workShop后播放第一个分组的第一个镜头
let newPVWTaskData = new UE.CamTaskDataRPC()
newPVWTaskData.WorkShopId = DirectorCamUtil.CopyGuid(placement.UUID)
newPVWTaskData.CamGroupId = DirectorCamUtil.CopyGuid(GroupData.UUID)
newPVWTaskData.CamIndex = 0
newPVWTaskData.StartFrame = 0
newPVWTaskData.bPreviewOneFrame = false
this.RequestPVWTaskServer(newPVWTaskData);
}
}
```