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

news2025/2/21 21:10:48

关键词: 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.coloradmin.cn/o/425921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(20230417)最大数合并区间重新排列单词间的空格 按奇偶排序数组 II 数组形式的整数加法

最大数(回顾等级:值得,已达最优解) 来源:自己LeetCode刷题 usa long cmp(const void* e1, const void* e2) {int* p1(int*)e1;int* p2(int*)e2;long n110;long n210;while(*p1>n1){n1*10;}while(*p2>n2){n2*1…

利用AOP实现统一功能处理

目录 一、实现用户登录校验 实现自定义拦截器 将自定义的拦截器添加到框架的配置中,并且设置拦截的规则 二、实现统一异常处理 三、实现统一数据格式封装 一、实现用户登录校验 在之前的项目中,在需要验证用户登录的部分,每次都需要利…

RK3568平台开发系列讲解(环境篇)使用USB线缆升级固件

🚀返回专栏总目录 文章目录 一、进入升级模式1.1、硬件方式进入Loader模式1.2、软件方式进入Loader模式二、安装烧写工具2.1、Windows操作系统2.2、Linux操作系统沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍了如何将主机上的固件,通过USB数据线烧录到…

Typora(Mckbook版)的使用方法

1、标题(⌘ 数字) 一级标题:(⌘ 1) 二级标题:(⌘ 2) 三级标题:(⌘ 3) 四级标题:(⌘ 4) ... 六级标…

0303github搜索案例-react应用

文章目录1 前言2 静态组件2.1 静态页面和样式2.2 静态组件3 axios请求github接口4 优化案例结语1 前言 学习了脚手架配置axios,我们通过访问github的接口来做个练习。实例效果如下所示: 搜索框输入github用户名关键字,点击搜索,列…

AD633JRZ-ASEMI代理ADI亚德诺AD633JRZ车规级芯片

编辑-Z AD633JRZ芯片参数: 型号:AD633JRZ 总误差:1% 标度电压错误:0.25% 电源干扰:0.01% 输出偏移电压:5mV 小信号带宽:1MHz 斜率:20V/s 沉降时间达到1%:2s 宽…

在 Rocky linux 8.7 使用 Kubespray v2.21.0 离线部署 kubernetes v1.24.0 集群

文章目录前言创建7台虚拟机要求配置代理下载介质介质初始化安装工具包配置互信编写 inventory.ini创建 offline.ymlt他、部署 offline repo部署 kubespray报错2报错3报错报错:container-engine/containerd : containerd | Create registry directories分…

5.Dockerfile

1.什么是Dockerfile Dockerfile其实就是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。 1、对于开发人员:可以为开发团队提供一个完全一致的开发环境; 2、对于测试人…

Servlet API

目录 1.HttpServlet 1.doGet 2.doPost 2.HttpServletRequest 2.1方法 2.2打印请求信息 2.3获取GET请求的参数 2.4post请求body格式 1.x-www-form-urlencoded 2.json 3.HttpServletResponse 3.1方法 3.2设置状态码 3.3自动刷新 3.4构造重定向的响应 1.HttpServlet 方法…

VMware Workstation Pro17安装并导入旧虚拟机系统

VMware Workstation Pro17 VMware是一个虚拟机软件,可以用来虚拟化各种系统,便于进行开发和其他相关工作 VMware Workstation Pro17支持window11版本,如果vm版本太低了升级window的时候会提示卸载旧版本的 下载VMware Workstation Pro17 h…

网格贪心搜索逼近最优组合解

如有错误,感谢不吝赐教、交流 文章目录背景描述实现方法一、寻找两组合的最优二、基于两组合的最优结果寻找四组合最优三、基于四组合的最优结果寻找八组合最优四、基于八组合的最优结果寻找十六组合最优总结适用场景背景描述 假如list [0, 1, 2, 3, 4, 5, 6, 7, …

2023年第三届智能机器人与系统国际会议(ISoIRS 2023) | IEEE-CPS独立出版

2023年第三届智能机器人与系统国际会议(ISoIRS 2023) | IEEE-CPS独立出版 会议简介 Brief Introduction 2023年第三届智能机器人与系统国际会议(ISoIRS 2023) 会议时间:2023年5月26日-28日 召开地点:中国长沙 大会官网:www.isoirs.org ISoIRS…

软件测试别再被“薪资陷阱”困扰了,这份攻略带你轻松查薪资

大家好,我是锦都不二。 测试岗面试 当HR问你期望薪资是多少时, 如果你回答: 10K 恭喜,你已经被HR成功套路, 拿到offer时你会在心里这么嘀咕:我要是当时报价15k该多好。 所以如何知道自己在这个市场上的价值&#xff0c…

95-拥塞控制

拥塞控制1.什么是拥塞控制2.拥塞控制的方法(1)慢启动和拥塞避免(2)快速重传和快速恢复1.什么是拥塞控制 在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超…

excel在文本的固定位置插入字符、进行日期和时间的合并

1.excel在文本的固定位置插入字符 如上图,现在想要将其转化为日期格式(比如2017/1/1),但是当设置单元格格式为日期时却显示出很多#。我们可以通过在20170101中添加两个斜杠“/”来将其转化为2017/1/1。可以用replace函…

基于SSM的二手车交易平台小程序

选题背景 互联网是人类的基本需求,特别是在现代社会,个人压力增大,社会运作节奏高,随着互联网的快速发展,用户的需求也越来越高,用户也将越来越多依靠互联网而不是自己获取信息,使得各种软件程…

【逗老师的无线电】BM的AirSecurity功能使用以防止他人使用你的DMRID

众所周知,在使用DMR热点和中继的时候,如果别人的手台上配置了你的ID进行恶意呼叫,或者伪装你的身份进行通联,之前是没有办法防范的。 目前,BM更新了AirSecurity功能,通过在呼叫前预先单呼一个作为密码的号码…

计算机组成原理——第二章数据的表示和运算(上)

提示:日出有盼,落日有念,心有所期,忙而不茫 文章目录前言2.1.1 进位计数制2.1.2 BCD码2.1.3 无符号整数的表示和运算2.1.4 带符号整数的表示和运算(原反补)2.1.5原反补码的特性对比2.1.6 移码2.1.7 定点小数前言 这里主要是根据王…

vue3 history模式配置及nginx服务器配置

vue的路由方式有hash模式和history模式,history模式路由看起来有好些,路由路径里没有#号,而hash模式默认是有#号的。 vue3开始默认新建的项目都是history模式,不过history模式打包后想要使用正常访问的话,需要后端服务…

BIO/NIO/Netty网络通信编程

文章目录1 BIO (BLOCK IO)2. NIO (new IO)2.1 NIO-Buffer缓冲区2.2 NIO-Buffer分散读-集中写2.3 NIO-Buffer粘包半包2.4 NIO-Channel2.4.1 files相关操作2.4.2 channel网络通信2.4.3 处理消息边界2.4.4 buffer大小分配2.4.5 处理大量写事件2.5 selector-Epoll2.6 IO模型2.7 零拷…