最近Helios开展了一个为期仅仅两周的内部项目,旨在让研究人员熟悉在ue4中创建多玩家虚拟现实程序的过程。由于HTC Vive有足够的游戏空间并具备运动控制器,所以它被选为实验的VR硬件。研究组将分别把玩家放置在不同的游戏场地,但是他们体验的虚拟场景是一样的,他们同时进行游戏并且积累游戏经验。此实验的目的是促进玩家在相同的虚拟世界中的互动与竞争。另外,研究人员还会在HTC Vive控制器触摸板里添加一些简单的命令,因为在游戏时两个玩家可能会争夺同一个fireflies,此时并不能保证他们都能听见相关指令,所以研究人员想到运用表情符号,或创造一些颜色和灯光信号,好让玩家能进行简单的交流。

为了完成以上实验,我们必须深入研究Unreal现有的网络功能。不负众望,Unreal具有非常出色的单击联网功能,并且所有actors都具有基础功能,比如“复制”指令能让服务器端的指令能快速复制到所有相关的客户端。不难发现,Unreal有非常完善的网络系统,这个系统具有良好的记录和实施指令的能力,但是他们比VR更关注传统游戏。

一个典型的传统游戏中,玩家只能在任意时间观察某一特定空间的情况,但是如果加入VR的话,您就能同时观察好几个空间并且切换到不同的玩家的视角。现在玩家的头和双手获得了解放,但是如果身体保持静止的话是无法实施指令的,所以还要想出办法控制所有的复制指令。

必须铭记这一点,因为复制指令只能从服务器发到客户端。客户端必须调用服务器RPC来更新变量或组播,然后才能复制到客户端。这点将在以后的项目总结中深入讨论。

泰课在线

第一步连接两个机器:
   除了一些允许添加其他控制器的室内VR组块外,蓝图能用于整个项目。蓝图能让您纵观整个项目,让您亲眼看到复制指令和网络系统是如何运行的。
   当用Unreal创建多人游戏时,需要设置在线子系统。这些子系统可以是steam,Playstation Network或XBox Live。但是,如果设置为“null”,系统会默认为LAN。要设置在线子系统,您必须进入您的Project.Build.cs,并对注释过的在线子系统取消备注。接下来,您必须将“OnlineSubsystemNull”添加到PublicDependencyModuleNames。
   充分利用Epic的LeARning 内容,并从现有的“多人射击”范例中复制粘贴所有的在线Blueprints代码。这一引用对Unreal该如何开始游戏,加入游戏,处理错误和其他网络问题等有很大帮助,也完美的展示了游戏模式—OnPostLogin是如何工作以及如何被应用的。

连接机器
   两台机器连接好以后,就要开始在从两台机器间获取数据。这些信息的获取通常被描述为“黑客方式”,因为它包含了很多强制实施指令,并给LAN带来很大负担。虽然它完全不能优化任何东西,也没有充分利用Unreal的网络功能,比如复制的变量,但是这些信息既稳定又行之有效。要想完整了解所有的复制方法,请参阅Unreal的复制文档。
   以下步骤适用于所有需要复制的内容。在这个例子中,我们将使用HMD的位置和方向指令,因为它们是复制到其他客户端的关键:
        相信客户端。有关欺骗因素不是这个项目的关注点,我们选择信任客户端传送到服务器的一切。所以不需要进行预测。   通过event图表划分服务器和客户端。在你的所有需要被复制actors中创建一个名为“服务器”的新的event图表,并将服务器端的功能加入该图表中。这个图表能帮您追踪哪些功能正在哪里运行。
   将所有相关数据发送到服务器。复制需要使用由“Run on Server”复制的custom event。您可以通过您的客户端把所有您想复制的数据传到这个新的event,,比如HMD的事件,位置和循环。
   从服务器组播一切。服务器的工作就是,从所有连接的客户端上调出最合适的 “组播”event,在此基础上转播前一步骤的数据。只有服务器可以调用组播功能,而这也是客户端首先将数据发送到服务器的原因。
   最后,多播服务器会将数据发送给每个客户端,所以所有客户端都会接收数据,并能进行位置和循环更新。现在,所有相关的actors都根据实践中用户的输入,或头部的移动完成了相应的更新。
 
注意事项
    IsLocallyControled:最后,您要确保自己始终都是使用IsLocallyControlled来确保您只从玩家的pawn,而不是从本地存储的其他远程pawn来发送数据。Pawn类的一个实例是它被复制到客户端来表示另一个玩家,所以代码被运行到您的本地Pawn而不是'ghost' pawn(另一个玩家)。运行IsLocallyControlled,可以确保我们只发送客户端数据,而不是“ghost”pawn数据。如果不这样做的话会系统会一片混乱。
       我们的fireflies是仅给客户端提供位置和循环复制的服务端。这给LAN增加了大量的额外数据。理想情况下,fireflies是确定的,本地的。
   充分利用PlayerState。所有连接的客户端的PlayerStates都可用于游戏模式(仅限服务器),这使得它成为存储分数或生命值的最佳地点。它能确保在游戏模式下检测到玩家是否达到获胜分数或是否死亡等讯息时,系统能做出及时的反应。

测试
   现在在服务器和客户端上我们有一些actors,并且它们都是复制的,我们需要对它们进行测试,不得不说,这很困难。您不能在同一台机器上测试两个客户端。 HMD不支持一次被两个应用程序使用,性能很快就会变得非常差(每秒只有半帧)。 我们使用Listen服务器来开始程序。这允许主机在扮演服务器的同时正常工作,并在调试时给予我们更多的控制权限。

    您还会遇到很多“服务器已更新但客户端没有”等类型的问题。这是因为玩家不理解UE4的服务器—客户端在网络模式下工作方式,而不是UE4代码的问题。您只需要花点时间去多关注一下有关复制及其应用方式的相关知识,就能解决这个问题了。
        VR多人游戏每次都需要两位开发人员进行测试。您曾经尝试过戴着两个HMD并且挥舞着四个运动控制器么?没有?我也是。
        不能通过编辑器来测试多人游戏。如果两个开发人员分别都在编辑地图(即使是相同的版本),但是如果尝试使用PIE,两人就会获得不同的地图版本,因为两个编辑器的客户端都会生成相应的PIE版本地图。
   解决办法就是不要使用“单机”,因为单机不适合用VR!但若您必须用VR Preview,就又得回去解决PIE不匹配的问题。
   解决方法还有不要使用“Launch”。尽管这个指令能做好并启动磁盘中的内容,它却会允许HMD的连接。但幸好它只会打开压缩包,或启动编辑器打开的当前内容。
    所以VR的解决办法是:您需要熟悉项目生成的“虚幻前端”。此工具允许用户自定义游戏的制作和部署过程。
   最重要的一点是,“项目启动器”在编辑器中“启动”的下拉菜单里。
   项目启动器允许您创建“自定义启动配置文件”,您可以选择“By the Book”这一项,然后在其中选择需要的配置文件和地图。
 
构建Shipping
   在线子系统默认平台服务—Null
   最后完成项目的所有传送,并将其部署在几台机器上进行播放测试。必须确保在构建之前将[OnlineSubsystem] DefaultPlatformService = Null放入DefaultEngine.ini文件中。 没有这个您的游戏将建立在没有一个定义好的OnlineSubsystem上,并将无法进行网络连接。

泰课在线

泰课在线

泰课在线

泰课在线

泰课在线

泰课在线

泰课在线

泰课在线

项目总结

   某种程度上来说这个项目是成功的,因为我们能够感受到在虚幻引擎4中创建多玩家虚拟现实体验的复杂性。我们了解了玩家之间沟通的重要性,即使是通过表情符号进行简单沟通也会带来不一样的游戏体验。另一个重要点是玩家的身体反馈,我们授予玩家用萤火虫网攻击他人的能力,同时被打击的玩家身上会出现一个愚蠢的表情符号。即使一个简单的复活节彩蛋也能增强游戏的体验性。这使得玩家感觉他们确实处于同一个游戏世界。没有它的话,玩家虽然可以看到对方,但会感到有些不足,会破坏了体验的沉浸性。
   实验最大的花销是就是过多的测试费用。对开发人员和质量保证团队来说这个测试实在太耗时了,这一点就足以打乱整个项目的时间表。但是如果没有足够的测试,一个项目很快就会陷入混乱。所以我们在这两周的时间里竭尽全力的设法完成了大量的测试工作,我们希望与未来的客户分享这个concept piece,希望为粉丝,用户和客户提供充分的相关知识。