Language:
Page Info
Tags:
Engine Version:
Share

重播系统

replay_banner.png

虚幻引擎4(UE4)拥有一个用于录制游戏以便稍后查看的 重播 系统。此功能适用于所有游戏,从在专用服务器上运行的实时多人游戏到单人游戏,甚至包括在编辑器中运行的会话。概括来说,重播系统的工作原理是使用 DemoNetDriver 从内置复制系统读取数据,类似于NetDriver在实时联网游戏环境中的工作方式。任何设置为复制数据的项目,即使项目实际上没有多人模式,无需进一步修改即可兼容重播系统。

该系统的工作方式是用 DemoNetDriver 将网络数据传递到重播流送器,后者处理过滤和存储数据的过程。查看重播时,DemoNetDriver 将可以访问实时游戏期间可用的所有复制信息(以及指定为仅与重播有关的特殊数据字段),因此它可以根据该数据重构游戏事件。

重播系统功能

重播系统的基本功能是启动和停止录制演示,或者回放先前录制的演示。在回放模式下,重播系统支持暂停、更改回放速度或跳转至特定时刻等命令。该系统的更多高级用法包括向重播添加文本标记(通常是游戏中涉及的元标记或玩家名称),或者根据显示的文本标记或版本信息查询现有重播。重播系统可以从C++代码使用,主要通过 UGameInstanceUWorld 类,或通过控制台命令或命令行参数。

函数或变量名称

等效的控制台命令

效果

UGameInstance::StartRecordingReplay

"demorec (ReplayName)"

开始录制播放。如果不提供(ReplayName)参数,则重播系统可以自己生成名称。

UGameInstance::StopRecordingReplay

"demostop"

停止当前正在录制的重播。

UGameInstance::PlayReplay

"demoplay (ReplayName)"

播放指定的重播。

UDemoNetDriver::GotoTimeInSeconds

"demoscrub (ReplayTime)"

跳转至重播中提供的时间(以秒为单位)。

UWorld::Pauser (variable)

"demopause"

场景的 DemoNetDriver->ServerConnection 有一个 OwningActor 变量。将 Pauser 设置到该值将暂停重播。将它恢复为 null 将恢复重播。"demopause" 控制台命令将自动设置或清除该变量。

WorldSettings->DemoPlayTimeDilation (variable)

"demospeed (ReplaySpeed)"

通过设置时间比例因子加速或放慢回放。值1.0表示正常速度。

AGameMode::bHandleDedicatedServerReplays (variable)

N/A

将该变量设置为 true 可以使专用服务器自动录制游戏。

DemoNetDriver和流送器

DemoNetDriver使用 流送器 来执行创建重播所需的信息的实际抽取和录制。根据重播数据的预设查看方式,可以讲不通的流送器连接到DemoNetDriver。引擎中包含了三种不同的流送器,每个流送器适用于不同的用例。NULL流送器 是默认值,用于将来自主机的事件直接录制到磁盘,因此更适用于单人游戏和在主机玩家自己的机器本地保存重播的游戏。内存流送器 在客户端机器上运行,将数据存储在内存中,因此非常适合于体育类游戏的“即时回放”功能或射击类游戏的“死亡回放”。最后,HTTP流送器 用于通过LAN或互联网向另一台机器发送重播数据,非常适用于专用服务器游戏以及可能需要实时流送给大量观看者、同时保证能迅速响应玩家的游戏。DemoNetDriver 是一个专用的网络驱动器,可将复制的数据传送给 流送器,后者会录制信息用于稍后的播放。关于引擎中包含的 DemoNetDriver 以及流送器的功能详情,请参阅DemoNetDriver与流送器 页面。

向后兼容性

重播系统支持到4.13版本的向后兼容性。这意味着,您可以对构建版进行修改,例如添加或移除复制属性,但仍加载和查看原始构建版录制的重播。在大多数情况下,将自动处理这个过程,因为重播系统将跳过已经删除的旧复制字段,或对已经添加的新复制字段使用默认值。请注意,覆盖了NetSerialize的结构体将要求能手动处理这些数据格式差异。因此,FArchive现在提供EngineNetVerGameNetVer函数,它们分别定义引擎和游戏版本,使您能够调整传入的重播数据以便适用于您的当前构建版。FNetworkVersion中的委托GetLocalNetworkVersionOverride可以绑定到一个返回您所选的uint32版本号的函数。如果不需要为了兼容而完全匹配,则FNetworkVersion有一个委托叫做IsNetworkCompatibleOverride,通过覆盖这个委托,可以比较两个版本号并判断它们是否兼容。

Tags