FPS Sample网络同步原理(一)https://unity.cn/projects/fps-samplewang-luo-tong-bu-yuan-li-yi
本期真正的大佬登场了!我记得2011年就看到过大佬分享的shadow gun中使用的shader。大佬所在的公司是MADFINGER,开发了很多脍炙人口的手游,我记得10年前我就玩过武士系列手游。

本期视频大佬分享了他们的新作《暗影之枪:战争游戏》使用了Unity的最新联网技术NetCode。上一篇FPS Sample网络同步原理(一)文章中介绍的联网FPS例子就是NetCode开发,只不过它是Unity开发的一个Demo,而这一篇则是完整使用NetCode开发并且商业化的游戏。

为了学清楚这篇视频我特意仔细研究了一下NetCode的原理,正式开始之前我先向大家介绍一下NetCode。NetCode会代替之前的UNet,它提供了3种联网模式:
- 点对点连接方式:比如有10个玩家联网,其中有一个主机客户端上同时跑了一个“服务器”,这就跟以前我们玩局域网CS一样,一定要有个主机玩家创建房间,其他客户端就可以加入这个房间。主机玩家负责转发消息同步多个客户端信息。这种点对点的方式可以不需要专业服务器,缺点也很明显就是延迟!之前的UNet就是这种技术方案。
- 专业服务器:NetCode提供了支持专业服务器的功能,就是可以支持在自己的服务器上跑一个Unity,多个客户端就可以和服务器上的Unity进行交互。这种方式就非常好了,比如像物理碰撞这种就可以在服务器上精准的计算出来了。
- 客户端:NetCode提供了一套前后端同时预测的方式,所以它的一部分代码是可以同时跑在客户端上的,NetCode底层全是DOTS,比如采用客户端+服务器的方式跑在手机上时,其实在本地开了两个ECS的World,一个是客户端的世界,另个一个是服务器的世界,各自执行自己的逻辑。通过DOTS技术的加持,网络模块的性能是可以保障的。
网络连接其实是很复杂的,需要考虑客户端、延迟、周围的服务、消息如何同步等,如果按照传统的方式客户端和服务器分开的话必然会增加很多开发难度,通过NetCode客户端就可以同时完成服务器大部分工作,让开发变得更加容易。

在和Unity的合作中也遇到了不少问题,总之相互合作克服了种种难题(大佬们都是用笔记本办公吗?我一用笔记本脖子就疼~~霍霍)

接着,负责和大佬公司对接的Unity小姐姐开始分享Multiplayer Services的整体接入流程

首先就是玩家登录系统,Unity开发了第三方用户登录认证系统,坦白说就是如果你没有自己的用户登录服务器的情况下,使用这项服务就可以方便的帮你管理用户。有了Unity的登录授权以后就可以更好的使用Unity提供的一些服务。如果你有自己的登录服务器也可以使用它,它可以帮你避免一些黑客攻击的麻烦。

因为开发者自己公司已经有一套自己的玩家登录系统,所以他的流程是这样的。黄颜色的部分表示自己公司登录服务器认证系统,紫颜色的部分表示Unity开发的第三方用户登录认证系统,每个手机客户端先连自己的服务器认证通过以后再和Unity的服务器连接,后面可以灵活的使用自己的其他服务或者Unity提供的其他服务。

登录完成以后需要寻找你的队伍以及和其他玩家进行匹配,就是我们俗称的"开黑"

接着就要开始匹配玩家了,匹配需要根据玩家自己的数据,以及自定义的匹配规则。下图中黄色的部分就是可以项目自定义的部分,最后匹配结束后就进入了multiplay专用服务器,就是前面我们说的服务器上跑一个unity(multiplay是Unity提供的服务器,我们可也可以换成自己的服务器)


大佬公司的接入如下,首先客户端会先ping一下unity的专用服务器,看下延迟情况确保每个客户端网络没有较大的异常,然后客户端向自己的服务器发送匹配消息,自己的服务器根据每个玩家的情况自定匹配规则,最后连上Multiplay服务器并且告诉所有客户端匹配成功可以进入正式游戏了。

由于每个客户端可能分散在全世界各个位置,首先需要给每个客户端匹配各自网络状态最好的Qos专业服务器。

服务器匹配到后接着需要匹配玩家,同一个服务器可能会开多个房间,每个房间的玩家应该是实力相当的。

匹配结束后即将开始游戏,此时Multiplay正式登场,Multiplay服务器是需要花钱购买的,如果你不想用Multiplay完全可以部署在自己的服务器上。

他们在接入Multiplay服务器的时候做了一个拓展,注意黄色部分的 MFG's Headless Unity Runtime,它们会运行时监测服务器的状态Monitoring Store,如果服务器已经不堪负荷可以切换到Headless点对点的方式进行游戏。(不知道大佬公司真这么做的,还是小姐姐加上去的,我总觉得服务器不堪负荷了应该加载服务器吧~)

接着大佬演示了它在Netcode中的拓展,在本地一个Unity编辑器中启动了一个服务器和2个客户端,在不同的客户端窗口中可以玩各自的角色。

由于大佬公司开发游戏的时候Unity的NetCode还并没有完善,所以他们不得不做很多拓展性的工作才能兼容现有Unity。我觉得他们就是用了Unity Transprort Layer拓展功能,有些重要的协议使用到了Reliable可信赖的序列UDP,有一些协议则不是那种重要就使用了Unreliable不可信赖序列UDP。

默认RPC的方式使用到了反射一方面效率不高,而且GC也不友好,所以他们就改了套自动生成代码的方式避免使用反射。(由于字体比较小,大家可以把图片下载下来放大了看)





然后就是多人语音聊天了,国内也有类似的服务。

结束后,台下有个小伙子问大佬你们是如何防止作弊的,大佬微笑的说,购买Unity专业服务器就可以提供一定防作弊功能,其他的是我们内部的技术不能说不出来,其实也对,如果说出来了如何防作弊,那么就会有新的外挂了,哈哈~

PPT下载:https://www.slideshare.net/unity3d/how-madfinger-is-leading-nextgen-multiplayer-mobile-fps-games-unite-copenhagen-2019
本文介绍了Unity最新联网技术NetCode在网络同步方面的应用,包括点对点连接、专业服务器及客户端预测三种模式,以及其在MADFINGER新作《暗影之枪:战争游戏》中的实践。NetCode替代了UNet,提供了更高效、低延迟的网络解决方案。
290

被折叠的 条评论
为什么被折叠?



