生存儿童中的分屏和游戏分享网络

这个夏天,Unity发布了其第一款游戏,与发行商合作伙伴KONAMI紧密合作。生存儿童是对经典儿童游戏的有趣更新,该游戏作为第一天的Nintendo Switch™ 2标题推出。
这款游戏完全基于Unity 6构建,因此开发团队在为新平台推出游戏时使用了新软件——这是一个巨大的挑战。此外,这款游戏可以在多种网络配置中享受,因此负责该项目的小型Unity团队必须构建一个强大的多人游戏架构,以支持这些选项。
查看多人网络故事的第一部分,我们分享了游戏网络架构背后的基本原理是如何结合在一起的。这篇文章扩展了这个基础,展示了团队如何构建游戏的分屏和Nintendo Switch 2 游戏分享功能。
Nintendo Switch是Nintendo的商标。

在我们解决了游戏网络架构中的许多问题后,我们开始考虑如何进行分屏,而这在Netcode for Entities中并没有提供。这是一个不同的挑战。在分屏中,必须有多个玩家,但这些玩家属于一个客户端。
Netcode for Entities假设每个客户端有一个玩家——如果有一个单独的游戏,连接到它的单独控制台,那么它就有一个玩家。当情况改变,实际上有两个玩家或三个玩家时,就没有办法为每个单独的玩家发送输入。它们必须作为一个整体发送。
我们有效地创建了一个虚拟输入玩家,没人能看到。它完全是不可见的,但它收集所有本地玩家的输入,最多四个(尽管最后我们没有做四人分屏)。它管理所有输入,然后每帧将所有输入发送到服务器。
在游戏中,玩家不管理自己的输入。这个虚构的虚拟输入玩家告诉他们每帧的输入是什么。之前,Netcode for Entities假设一个玩家负责获取其输入并使用其输入进行所有移动,但在这里有另一个玩家不进行任何移动,但持有所有其他的输入。
从网络的角度来看,分屏是主要挑战。为了避免多个摄像头的问题,我们开始时让第二个玩家在第一位玩家的摄像头旁边跑动。这很快就实现了,但随后我们遇到了其他问题,比如如何设置第二个摄像头?如何将一台摄像头放在屏幕左侧,另一台放在屏幕右侧?我们还必须解决用户界面的问题,因为有很多用户界面只有一个玩家可以看到。例如,如果一个玩家在一根原木前,他们会看到一个小提示按钮,上面写着:“嘿,按X来捡起这根原木”,但当然你不希望另一个玩家看到这个。
我们必须想办法隐藏用户界面,以便如果另一个玩家在附近,他们不会看到。我们为此使用了图层,但我们的修复更多地与用户界面有关,而不是网络。我们决定最终希望将游戏锁定为两个分屏玩家,以获得更好的游戏体验——即使是在大屏幕上,也只能有两个本地玩家。我们可以在内部进行四个分屏,并且我们保持了这一点很长时间,因为这是压力测试性能的好方法,因为每个玩家都会增加一点处理量、渲染量和另一个模拟的玩家。

在任天堂Switch 2开发期间的一个功能是GameShare。你实际上是在向另一台控制台发送视频流——实际上,从网络的角度来看,这只是分屏——只是系统将一个摄像头发送到另一台控制台,而不是在屏幕上渲染。
我们的四人分屏是我们如何处理GameShare模式的基础。只要性能可以,我们可以连接任意数量的玩家,并且可以将视频流传输到该控制台。我们不想做四人分屏的主要原因实际上是屏幕大小。除非你有一台巨大的电视,否则很难看到窗口——但如果你有自己的控制台,视频可以流传输到那里。
我们努力区分我们的双人分屏模式,以便在GameShare中支持额外的第三个玩家。你可以有一个主机和两个客人,同时为玩家提供出色的体验和平稳的性能。我们不愿意降低我们的标准,但我们仍然能够利用分屏架构来支持GameShare。
我们添加的一个非常有用的功能是调试命令。我们有一个开发菜单,所以你可以按一个按钮,调出菜单,然后在里面输入命令。这很方便,因为它让我们可以运行大量的调试内容——这些内容在最终游戏中都被编译掉了,所以当然没有人能在最终的游戏中做到这一点。但是我们在分屏中有一个模式是可以复制主玩家——这让你可以有一个分屏,其中一个控制器控制两个玩家。这是一种很好的测试分屏的方法,不需要有很多控制器,这使得测试变得更容易。
分屏设置还有效地运行了我们所做的所有正常网络代码。由于玩家彼此是分开的,服务器会发送信息以展示在线游戏是如何工作的。但也可以测试代码在多人模式下是否有效,而不需要将一个玩家连接到另一个客户端,只需在编辑器中启动分屏模式,使用另一个控制器在那儿玩。不需要进行新的构建,因为可以在分屏上测试代码,作为正常在线游戏的代理。
我们发现还有另外两个Unity工具非常有用,尽管我们直到项目结束时才使用它们。Unity 6包含新的多人游戏模式工具,使我们能够在没有单独玩家构建的情况下进行测试。
打开编辑器,进行一次干净的玩家构建需要超过一个小时,因为有太多的艺术和其他信息,所以使用远程玩家测试代码意味着至少要等待这么久。这对于迭代并不是特别好。但多人游戏模式使你能够有效地启动另一个窗口,就像编辑器的另一个虚拟版本,并以那种方式连接。
实体的网络代码也有游戏模式工具来模拟糟糕的网络连接。你可以指定并模拟特定的延迟水平——比如说,300毫秒的延迟,模拟与一个在机场将手机连接到笔记本电脑并以这种方式连接游戏的朋友一起玩时的糟糕往返。然后你可以在编辑器中测试,以找出延迟或不稳定的程度。有时在丢失数据和丢包的网络连接上这并不起作用,而我们可以轻松地模拟这一点。
这种测试一直在进行。一段时间以来,我们有一个规则,任何人都不允许在关闭模拟器的情况下在编辑器中玩——每个人都必须在某种模拟延迟下玩,因为我们的玩家不会在完美的连接上玩。这样,我们就永远不会自欺欺人地认为超高速的办公室宽带是具有代表性的。
最终,所有这些测试都得到了回报——我们能够在不同的网络和多人设置中以60帧每秒交付流畅且高性能的游戏。自游戏几周前发布以来,我们看到玩家们通过Lobby和Relay继续在线互动,希望无论他们的家庭网络条件如何,都能享受无缝且强大的游戏体验。
查看我们博客系列的其他部分,深入了解生存儿童的制作:
- "来自生存儿童"的图形和渲染技巧
- "生存儿童中的关卡布局和地形工作流程"
- "生存儿童多人网络基础设施内部"
要了解更多关于使用Unity制作的项目,请访问资源页面。
