UE4 回放系统升级到UE5之后的代码报错问题解决

news/2024/11/15 6:56:46/

关键词: UE4 回放系统 升级 UE5 报错 DemoNetDriver GetDemoCurrentTime GetDemoTotalTime

背景

照着网上教的UE4的回放系统,也叫重播系统,英文Replay。做完了,测试运行正常,可升级到UE5却报了一堆 WorldSetting 和 Pauser 错。
本文将介绍如何解决这些错误,此方式不止在UE5中可以运行,也让你的UE4可以运行。

报错现象

抱歉忘了截图 反正就是有关 WorldSetting 和 Pauser 的错误。

查找问题

WorldSetting 文件里的 Pauser 追溯源码,看到如下图,“在4.23之后 这个属性就被弃用了,请使用GetPauserPlayerState()或者SetPauserPlayerState()”
在这里插入图片描述
所以猜测,UE4的版本一直在坚持维护,到了UE5,干脆直接放弃了。

那么,咱们更新一下新代码就可以了。

解决方法

请重点确认下图中,画红框的这几个地方。因为这几个函数名字变了。在旧版本是变量,新版本变成有返回值的函数了。

除了下图红框的部分,别的地方都沿用网上的其他回放教程就行,不用改。

下图是PC_ReplayerSpectator.cpp文件 是我创建的旁观者控制器,继承自PlayerController。它的头文件跟网上其他教程是一样的。

在这里插入图片描述在这里插入图片描述

完整代码

// Fill out your copyright notice in the Description page of Project Settings.#include "PC_ReplayerSpectator.h"
#include "Engine/World.h"
#include "Engine/DemoNetDriver.h"APC_ReplayerSpectator::APC_ReplayerSpectator(const FObjectInitializer& ObjectInitializer) :  Super(ObjectInitializer)
{bShowMouseCursor = true;//显示鼠标PrimaryActorTick.bTickEvenWhenPaused = true;bShouldPerformFullTickWhenPaused = true;
}
bool APC_ReplayerSpectator::SetCurrentReplayPausedState(bool bDoPause)
{//设置暂停状态AWorldSettings* WorldSettings = GetWorldSettings();//设置抗锯齿为FXAA 和 关闭运动模糊,否则在回放暂停中画面会有问题。//命令行 抗锯齿static const auto CVarAA = IConsoleManager::Get().FindConsoleVariable(TEXT("r.DefaultFeature.AntiAliasing"));//命令行 运动模糊static const auto CVarMB = IConsoleManager::Get().FindConsoleVariable(TEXT("r.DefaultFeature.MotionBlur"));if (bDoPause){PreviousAASetting = CVarAA->GetInt();PreviousMBSetting = CVarMB->GetInt();//关闭运动模糊,关闭抗锯齿TXAA切换成FXAA,因为变速播放,跳放会对帧速率产生变化CVarAA->Set(1);CVarMB->Set(0);//设置 暂停状态 ,当SetPauserPlayerState不为NULL时,则暂停WorldSettings->SetPauserPlayerState(PlayerState);//整个函数返回true,输出暂停。return true;}CVarAA->Set(PreviousAASetting);CVarMB->Set(PreviousMBSetting);//当SetPauserPlayerState 为NULL时,则不暂停WorldSettings->SetPauserPlayerState(NULL);//整个函数返回false,输出继续播放。return false;
}
//获取当前影片的总时间
int32 APC_ReplayerSpectator::GetCurrentReplayTotalTimeInSeconds() const{if (GetWorld()){if (GetWorld()->GetDemoNetDriver()){return GetWorld()->GetDemoNetDriver()->GetDemoTotalTime();}}return 0.f;}
//获取当前时刻的时间
int32 APC_ReplayerSpectator::GetCurrentReplayCurrentTimeInSeconds() const{if (GetWorld()){if (GetWorld()->GetDemoNetDriver()){return GetWorld()->GetDemoNetDriver()->GetDemoCurrentTime();}}return 0.f;}//设置跳转到的时刻
void APC_ReplayerSpectator::SetCurrentReplayTimeToSeconds(int32 Seconds) 
{if (GetWorld()){if (GetWorld()->GetDemoNetDriver()){GetWorld()->GetDemoNetDriver()->GotoTimeInSeconds(Seconds);}}
}
//设置播放速率
void APC_ReplayerSpectator::SetCurrentReplayPlayRate(float PlayRate)
{if(GetWorld()){if (GetWorld()->GetDemoNetDriver()) {GetWorld()->GetWorldSettings()->DemoPlayTimeDilation = PlayRate;}}
}

附件:

PC_ReplayerSpectator.h 头文件 你或许会有用

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "PC_ReplayerSpectator.generated.h"/*** */
UCLASS()
class AUCDISPLAY_API APC_ReplayerSpectator : public APlayerController
{GENERATED_BODY()public:APC_ReplayerSpectator(const FObjectInitializer& ObjectInitializer);protected:int32 PreviousAASetting;int32 PreviousMBSetting;UFUNCTION(BlueprintCallable, Category = "CurrentReplay")bool SetCurrentReplayPausedState(bool bDoPause);UFUNCTION(BlueprintCallable, Category = "CurrentReplay")int32 GetCurrentReplayTotalTimeInSeconds() const;UFUNCTION(BlueprintCallable, Category = "CurrentReplay")int32 GetCurrentReplayCurrentTimeInSeconds() const;UFUNCTION(BlueprintCallable, Category = "CurrentReplay")void SetCurrentReplayTimeToSeconds(int32 Seconds);UFUNCTION(BlueprintCallable, Category = "CurrentReplay")void SetCurrentReplayPlayRate(float PlayRate = 1.0f);};

祝你成功


http://www.ppmy.cn/news/46881.html

相关文章

Java数据结构与算法----动态规划(背包篇)

1. 0/1背包 1.1.算法思路 0/1背包是动态规划、背包问题中最经典的问题啦!它主要的问题是: 给定n种物品、这n种物品的重量分别是,价值分别是 ,而你有一个容量为C的背包,请问如何求出所能拿的最大价值呢? …

【Java EE】-网络编程(一) 网络初识

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 主要内容:单机、局域网、广域网、交换机、路由器。IP地址,端口号,协议,五元组。 协议分层,OSI七层网络模型…

ChatGPT团队中,3个清华学霸,1个北大学霸,共9位华人

众所周知,美国硅谷其实有着众多的华人,哪怕是芯片领域,华为也有着一席之地,比如AMD 的 CEO 苏姿丰、Nvidia 的 CEO 黄仁勋 都是华人。 还有更多的美国著名的科技企业中,都有着华人的身影,这些华人&#xff…

JVM:线上服务CPU爆满,如何排查(三)

0. 引言 前一段时间出现了一个正则表达式引起的线上CPU爆满的问题,一开始没有在第一时间定位到问题,这里也特此记录一下,同时也系统的梳理下CPU爆满问题的排查思路和方法,为后续的同学提供参考。 1. CPU爆满问题产生的原因 我们…

Cloud computing(后续慢慢补充)

Cloud computing 可以看到右侧的容器虚拟化架构中,不需要运行额外的OS,这样启动的服务性能会相比于通过虚拟化软件实现的架构更优秀。但是虚拟机同样也有它的优点,比如它的安全、隔离性,可以运行不同的操作系统等等。 Virtualiz…

Java对日开发成趋势?网友:找工作打开了新思路

近两年行业环境起起伏伏,企业降本增效,提高人才招聘的门槛,导致大家找工作时觉得越来越难,尤其是Java开发,主打的就是一个“卷”! 不过行业变革,挑战与机遇并存。Java作为编程语言排行榜的常年第…

278. 第一个错误的版本

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, ..., n],你想找出导…

系统规划与管理师相关英语

1、system planning and management engineer 系统规划与管理师 2、information technology 信息技术 3、computer science and communication technology 计算机科学和通信技术 4、design、develop、install、implement information system and application softw…