如何利用分布式权限来进行多人合作游戏

当Arcane Alpacas在今年早些时候在Steam上发布他们引人入胜的FPS射击游戏Dagger Directive的第一个演示时,整体反馈非常好——但社区明确表示他们希望一起玩这个游戏together。基于这一反馈,团队决定为游戏添加multiplayer功能。他们测试了几种不同的解决方案,最终决定使用Unity 6中包含的一套内置多人解决方案。我们与程序员和设计师Daniel Fowler坐下来,了解他们如何利用Unity的Netcode for GameObjects、Relay和其他网络服务来连接玩家,以及Distributed Authority(DA)如何通过精简、可扩展的服务器支持来驱动整个操作。
让我们先谈谈Arcane Alpacas是如何开始的,以及你们想要创造什么。
Daniel Fowler,程序员和设计师:我几年前开始了这家公司。在此之前,我们——Wade Hribar、Cody Rowland和我——在Oculus工作,参与了Onward,一款VR FPS游戏,我们想要摆脱为大公司工作的状态。
我自己开始了这个项目,然后随着需要逐渐引入其他两位。我与MicroProse签订了出版合同,然后发布了一个演示。演示效果很好,我们想要添加多人功能,因为这是社区反馈的最大点。从那时起,游戏表现良好。我们已经上线,并且即将发布一个内容包。
几周前,我们在与Unity团队交谈后发布了一个网络更新——他们给了我们一些反馈,我们也分享了一些,我们得到了很多好的想法,并进行了实施。现在多人模式稳定得多,我们大多数时候得到了社区的积极反馈,尽管当然还有一些问题需要解决。
太好了!这个项目还有什么其他进展吗?
我在四年半前开始了这个项目。那时,我们正在将Onward移植到Quest,所以我们正在将一款高端PC VR游戏移植到手机上。在这个过程中,我们不得不去掉很多东西——尤其是草地,而且我们无法在Oculus上使用计算着色器。所以我想开始一个项目,看看我如何能生成大量的草,并且让它运行得相当高效。最后,我建立了一个自定义草地系统,使用Burst compiler生成数百万个草、植物和花朵的多边形,随着玩家在地图上移动。
玩家可以选择任何时间开始他们的任务,时间在他们玩的时候会进展——所以在早上6点开始任务并等待一个小时,太阳的位置会移动那么多。我们使用了完全实时的光照,并且构建了自己的天空着色器。后期处理也受到这个影响,依靠可脚本化对象来保存所有值以及它们在一天中的变化,光照和时间影响AI行为和传感器。
我添加了时间的内容,因为我也想玩弄实时光照,因为我们也在为第二款游戏做准备。这是我有趣的周末活动。然后过了一段时间,我开始添加一些角色,感觉我有了一个完整的游戏。我把这个做得更好,让一些同事来玩,他们很喜欢。
实时光照和数百万个草的多边形之所以可能,是因为我们使用了Universal Render Pipeline (URP)和Forward+ rendering,以及GPU Resident Drawer和GPU occlusion culling。在我们从Unity 2021.3升级到Unity 6之前,我们一直在使用SRP批处理器。Resident Drawer和遮挡剔除使性能提高了大约20%,较低复杂度的着色器和纹理也帮助了性能。我们通过在进行时使用RenderDoc进行采样来验证这一切是否正常工作,并在出现问题时进行修复。最后,你可以在SteamDeck上以30-60 fps的中等图形设置进行游戏。
我真的想构建一个大型开放环境,让玩家可以随心所欲。这更像是一个沙盒,而不是像Call of Duty那样的东西,你只是沿着同一条走廊走,面对同样的敌人。我想给玩家自由选择如何接近不同的目标,并混合时间的变化。然后通过合作游戏,这允许他们分成个人或两人小组,或者保持在一个四人大的团队中——这增加了不少乐趣。
我们将扩展这个游戏——我们还有五个任务即将推出。我们刚刚完成了我们的第一个内容包,增加了另外12种武器,14或16种制服选项,以及一堆新设备。
我真的很喜欢旧的Delta Force和Ghost Recon游戏,所以我想建立一些类似的东西。我必须保持艺术风格简单,因为我是一名工程师,而不是真正的艺术家。我专注于做我能做到的艺术——所以如果我必须自己做整个游戏,我就能做到。这就是游戏风格的来源。但我认为这效果很好,将实时光照效果和后期处理与旧式纹理和低多边形模型混合在一起。这有点把很多东西结合在一起。
我认为Valheim在发布时给了我很多灵感,因为在那之前我并没有真正拥有所有的后期处理和光照效果,它看起来更像是90年代中期的游戏。然后我看到他们对许多效果的处理,我想我也可以做到。
你什么时候切换到Unity 6的?
项目开始于Unity 2019,然后我升级到Unity 2021.3。我一直等到去年底,才升级到Unity 6,只是为了测试GPU遮挡剔除。这给我们带来了15%到20%的性能提升。
之前,我使用的是SRP Batcher与URP和其他一些东西,我能够关闭所有这些东西,只使用GPU遮挡剔除。我不使用LOD,但它有根据屏幕大小剔除的设置,所以我把所有这些都打开了,再次,性能提升了15%到20%。现在我们已经在Steam Deck上运行游戏。自从看到性能提升后,我就没有再回去过。

让我们多谈谈网络方面——你是如何使用Relay的?
这主要是为了玩家,所以他们不必在路由器上设置一堆东西。我尝试了端口转发,当我花几天时间测试一堆多人游戏系统并查看哪些效果良好时。我们最初设置得很快,但一旦我们决定使用Unity 6的多人游戏进行网络连接,我就继续设置了Relay,从那时起我们一直在以这种方式进行测试。
为了性能,我们一直在使用网络模拟器,这工作得很好。仅仅连接到热点上的手机就帮助我们在测试性能方面取得了很大进展。
你也使用了分布式权限。这是怎么发生的?
在我们发布演示版后,我考虑过为这个游戏做多人游戏。反馈的最大点是人们想要合作游戏——我们知道这会是一个大事情,但我们原本打算把它留到第二款游戏。
但考虑到反馈的数量,并在与我们的发行商交谈后,我们决定坐下来看看需要多长时间。我尝试了Photon,然后是Photon的Fusion系统,接着又看了几个其他库。我考虑过自己构建一个,然后决定尝试Netcode for GameObjects。我决定尝试分布式权限,因为基本上整个游戏已经完成——我不想处理请求和请求对GameObjects所有权变更的批准。
由于这是一个合作游戏,作弊并不是我们真正关心的问题——如果他们和朋友一起作弊,那就由他们自己决定。我们游戏中也有作弊选项,所以他们可以开启无限弹药等等——所以如果他们在复制物体,那也没什么关系。
这帮助我决定使用DA。我们能够快速设置这些东西,这样其他两名成员可以专注于完成内容,而我则专注于所有网络相关的工作。我估计我们需要12或13周才能完成所有工作,结果大约花了14周。

你在使用Relay,所以我想有时你以直接连接模式运行它?
是的。我还设置了直接连接,这样玩家可以自己运行并让他们的朋友直接连接到他们。他们需要在路由器上设置端口转发,但我有关于如何设置的说明。但如果没有主机迁移,那么如果主机掉线,游戏就会结束。
这个功能更多是为了我们作为工作室关闭时,或者如果Unity关闭中继服务器等情况,玩家至少可以继续玩直接连接的游戏,希望能持续一段时间。
这很有道理。这非常前瞻性,对玩家也很好,所以听到这个真是太棒了。
在过去15年里,我参与的几乎每个游戏都是多人游戏,这在我待过的地方都是个问题——某些东西意外关闭,然后我们不得不匆忙修复。我想提前应对这些问题。
你在讨论中提到过主机迁移和所有权转移。你觉得DA带来的价值如何?这对你的游戏是个好补充吗,帮助了开发吗?
尤其是主机迁移几乎是无缝的。再说一次,这一直是我过去参与的游戏中的一个问题,主机突然消失,然后我们必须切换很多东西,决定谁拥有什么等等。
但有很多事情就是有效的。我做这个已经很久了,所以我看到这种情况发生时,起初我非常怀疑。但我们也没有遇到问题,或者如果遇到小问题,我只需查看文档,通常是“哦,我忘记勾选一个框,表示自动将这个游戏对象转移给下一个人”,或者其他的。这只是确保我正确设置的一个问题,所以如果我遇到问题,我可以快速用这个系统解决。
查看Dagger Directive在Steam上的早期访问,并查看团队的最新更新在这里。了解更多关于分布式权限和其他Unity多人解决方案的信息,并在我们的资源页面上找到Unity开发者的故事。
