UE4虚幻引擎VR交互多人游戏体验
最近,Helios开展了一个为期两周的内部项目,旨在让研究人员熟悉在UE4(Unreal Engine 4,虚幻引擎4)中创建多玩家虚拟现实程序的过程。由于HTC Vive具备足够的游戏空间且拥有运动控制器,因此被选为本次实验的VR硬件。
研究组将玩家分别置于不同的游戏场地,但他们体验的是相同的虚拟场景,玩家将同时进行游戏并积累经验。此实验的目的是促进玩家在同一虚拟世界中的互动与竞争。此外,研究人员还计划在HTC Vive控制器触摸板中添加一些简单命令。在游戏过程中,两个玩家可能会争夺同一个“萤火虫(fireflies)”,此时无法保证他们都能听到相关指令,所以研究人员考虑运用表情符号,或创造一些颜色和灯光信号,以实现玩家间的简单交流。
深入研究Unreal网络功能
为完成上述实验,我们需要深入研究Unreal现有的网络功能。Unreal具备出色的单机联网功能,所有“actors”都拥有基础功能,例如“复制”指令可使服务器端的指令快速复制到所有相关客户端。可以看出,Unreal拥有非常完善的网络系统,该系统具备良好的记录和执行指令的能力,但相较于VR,它更侧重于传统游戏。
在典型的传统游戏中,玩家在任意时间只能观察某一特定空间的情况。而加入VR后,玩家能够同时观察多个空间,并切换到不同玩家的视角。此时,玩家的头部和双手得以解放,但如果身体保持静止,则无法执行指令,因此还需想出控制所有复制指令的办法。
需要铭记的是,复制指令只能从服务器发送到客户端。客户端必须调用服务器RPC(远程过程调用)来更新变量或进行组播,然后才能将其复制到客户端,这一点将在后续的项目总结中深入探讨。
连接两台机器
蓝图的使用
除了一些允许添加其他控制器的室内VR组块外,蓝图可应用于整个项目。蓝图能让开发者纵观整个项目,直观地看到复制指令和网络系统的运行方式。
设置在线子系统
使用Unreal创建多人游戏时,需要设置在线子系统,这些子系统可以是Steam、PlayStation Network或XBox Live。若将其设置为“null”,系统会默认使用LAN(局域网)。要设置在线子系统,需进入Project.Build.cs文件,取消对注释过的在线子系统的备注,并将“OnlineSubsystemNull”添加到PublicDependencyModuleNames中。
引用范例代码
充分利用Epic的学习内容,从现有的“多人射击”范例中复制粘贴所有在线Blueprints代码。这一引用对了解Unreal如何开始游戏、加入游戏、处理错误和其他网络问题有很大帮助,同时也完美展示了游戏模式 — OnPostLogin的工作原理和应用方式。
连接机器后的数据获取
两台机器连接完成后,需要在它们之间获取数据。这种数据获取方式常被称为“黑客方式”,因为它包含大量强制实施的指令,会给LAN带来较大负担。虽然该方式未能充分利用Unreal的网络功能,如复制变量,但获取的信息稳定且有效。若要全面了解所有复制方法,可参阅Unreal的复制文档。
以下步骤适用于所有需要复制的内容,以HMD(头戴式显示器)的位置和方向指令为例,它们是复制到其他客户端的关键:
- 信任客户端:由于欺骗因素并非本项目的关注点,我们选择信任客户端传送到服务器的所有数据,因此无需进行预测。
- 通过event图表划分服务器和客户端:在所有需要被复制的“actors”中创建一个名为“服务器”的新event图表,并将服务器端的功能添加到该图表中。此图表有助于追踪各个功能的运行位置。
- 将相关数据发送到服务器:复制操作需使用由“Run on Server”复制的自定义事件(custom event)。客户端可将所有需要复制的数据,如HMD的事件、位置和循环信息,发送到这个新事件中。
- 服务器进行组播:服务器的任务是从所有连接的客户端中调用最合适的“组播”事件,并转播上一步骤的数据。只有服务器能够调用组播功能,这也是客户端先将数据发送到服务器的原因。
- 客户端接收数据:多播服务器将数据发送给每个客户端,客户端接收数据后,即可进行位置和循环更新。至此,所有相关的“actors”都能根据用户的输入或头部移动进行相应更新。
注意事项
- 确保数据来源:要始终使用“IsLocallyControlled”来确保只从玩家的“pawn”(角色),而非本地存储的其他远程“pawn”发送数据。因为“pawn”类的实例会被复制到客户端以表示其他玩家,使用“IsLocallyControlled”可确保只发送客户端数据,避免系统混乱。
- 优化“萤火虫”数据:我们的“萤火虫”是仅为客户端提供位置和循环复制服务的服务器端,这会给LAN增加大量额外数据。理想情况下,“萤火虫”应是确定的、本地的。
- 利用PlayerState:所有连接客户端的“PlayerStates”可用于游戏模式(仅限服务器),是存储分数或生命值的理想位置。它能确保在游戏模式下检测到玩家是否达到获胜分数或是否死亡等信息时,系统能及时做出反应。
测试
目前,服务器和客户端上已有一些复制的“actors”,需要对其进行测试,但这并非易事。
- 不能在同一台机器上测试两个客户端:HMD不支持同时被两个应用程序使用,否则性能会变得极差(每秒仅半帧)。我们可使用Listen服务器启动程序,这样主机在充当服务器的同时能正常工作,且在调试时拥有更多控制权。
- 理解网络工作模式:可能会遇到“服务器已更新但客户端没有”等问题,这通常是因为玩家不了解UE4的服务器 - 客户端在网络模式下的工作方式,而非UE4代码本身的问题。只需花时间深入了解复制及其应用方式,即可解决该问题。
- 需要两位开发人员测试:VR多人游戏每次测试都需要两位开发人员。由于不能通过编辑器测试多人游戏(两个开发人员分别编辑地图时,使用PIE会导致获得不同的地图版本),因此不能使用“单机”模式(单机不适合VR)。若必须使用VR Preview,则需解决PIE不匹配的问题。同时,也不建议使用“Launch”指令,因为它虽能启动磁盘内容,但会允许HMD连接,且只会打开压缩包或启动编辑器当前打开的内容。
- 使用“虚幻前端”:VR测试的解决方案是熟悉项目生成的“虚幻前端”工具,该工具允许用户自定义游戏的制作和部署过程。“项目启动器”位于编辑器的“启动”下拉菜单中,可创建“自定义启动配置文件”,选择“By the Book”项,并选择所需的配置文件和地图。
构建Shipping
在完成项目的所有传送并部署到多台机器上进行播放测试之前,必须确保将 [OnlineSubsystem] DefaultPlatformService = Null
放入DefaultEngine.ini文件中。否则,游戏将在未定义的OnlineSubsystem上构建,无法进行网络连接。
项目总结
从某种程度上说,这个项目是成功的。我们深刻体会到在虚幻引擎4中创建多玩家虚拟现实体验的复杂性。认识到玩家之间沟通的重要性,即使是简单的表情符号交流也能为游戏带来不同的体验。此外,玩家的身体反馈也很关键,例如授予玩家用萤火虫网攻击他人的能力,并在被打击玩家身上显示一个有趣的表情符号,即使是简单的“彩蛋”设计也能增强游戏的沉浸感,让玩家感觉真正处于同一个游戏世界中。
然而,实验的最大开销在于过多的测试费用。对开发人员和质量保证团队而言,测试工作非常耗时,这可能会打乱整个项目的时间表。但如果测试不足,项目很快就会陷入混乱。在这两周时间里,我们竭尽全力完成了大量测试工作,希望能与未来的客户分享这一成果,为粉丝、用户和客户提供充分的相关知识。