在多人游戏中,客户端需要同步。可以直接从传输中交换数据包,但这对于经验不足的开发人员来说可能很复杂。那么,让我们看看一些适用于各种用例的现成网络解决方案。
你好!我是 Dmitrii Ivashchenko,MY.GAMES 的首席软件工程师。我们关于 2023 年 Unity 实时多人游戏格局的系列文章仍在继续!今天的主题涉及我们可以使用的实时多人游戏的现成解决方案。让我们开始吧。
在多人游戏中,服务器和客户端通过网络发送数据包来交换数据。为了为从不同位置连接的玩家创建共享虚拟空间,游戏过程中的事件(例如角色移动或对象创建)通过向其他客户端发送数据包来与其他客户端同步。通过网络发送和接收数据包的负责方称为传输层。
理论上可以通过直接调用传输的发送函数来发送这些数据包,对于缺乏多人游戏经验的开发人员来说,这种方法很快就会变得不方便。因此,最好使用下面列出的其中之一,而不是从头开始编写自己的。让我们看看这些解决方案。
Unity 提供了两个 Netcode 包:Netcode for GameObjects(处于预览版本阶段)、Netcode for Entities(处于实验模式)和已弃用的 UNET。它还提供 Unity Relay 服务来连接游戏客户端 - 现在让我们来讨论一下。
Unity Relay 是游戏开发人员通过加入代码机制在玩家之间提供增强连接的一种方式,无需投资第三方解决方案、维护专用游戏服务器 (DGS) 或担心多人游戏中的网络复杂性。中继服务不使用 DGS,而是通过充当代理的通用中继服务器提供连接。
中继服务允许玩家通过多种不同的协议进行通信,包括 UDP、DTLS 和安全 WebSocket (WSS)。选择中继服务器后,客户端使用上述协议之一直接与中继服务器通信。 WebSocket 连接允许使用 WebGL 在浏览器中进行多人连接。
Relay 支持与任何游戏引擎配合使用。如果您将 Relay 与 Unity 结合使用,最佳做法是使用 Relay SDK,它与 Unity Transport Package (UTP) 集成。
Unity Transport 是一个用于开发多人游戏的低级网络库。它支持游戏对象的网络代码和实体的网络代码,但您也可以将其与您的解决方案一起使用。
得益于 UDP 和 WebSocket 之上提供的基于连接的抽象层(内置网络驱动程序),Unity Transport 可以轻松支持 Unity Engine 支持的所有平台。您可以配置加密或不加密的 UDP 和 WebSocket。您还可以使用管道来获得附加功能,例如可靠性、数据包排序和数据包分段。
Transport 2.0 的主要功能包括增加了对 WebGL 的支持;这使得 Unity Transport 包可以在 Unity Engine 支持的所有平台上使用。传输用户现在可以访问我们的 Websocket 传输实现,无论是否带有 TLS。移动玩家现在可以利用透明的网络迁移(通常是在蜂窝塔之间)。此功能当前仅限于客户端和 UDP 传输。
要使用 Unity Transport,您需要安装 Unity Editor 版本 2022.2 或更高版本,并安装com.unity.transport
包。
Relay 与 Unity Transport (UTP) 配合使用,允许客户端进行连接,否则由于路由限制(例如严格的防火墙)而无法进行通信。
继电器有以下限制:
尽管存在局限性,中继服务仍然是一个强大的工具,可以简化玩家连接并提供流畅的多人游戏体验。
Relay 主要游戏网络代码的两个最流行的解决方案包括 Netcode for GameObjects (NGO) 和 API Mirror Networking。
推荐的最佳实践是使用 NGO(在大多数情况下),因为它提供了一组稳定的核心功能,例如网络变量、场景管理、远程过程调用 (RPC) 和消息传递。然而,由于其简单性和易用性,API Mirror Networking 也非常适合不需要 NGO 提供的全套功能的游戏。
Photon Realtime 是多人游戏的核心层(以及来自 Photon 的更复杂的网络解决方案)。它使用可扩展的方法处理玩家匹配和快速通信等问题。 Photon Realtime 可用于游戏和更具体的多人游戏解决方案。
Photon Realtime 不包括 Fusion 或 Quantum 解决方案中的游戏状态和模拟同步机制,而是专注于网络上的消息传输。
Photon Realtime 一词还包含我们广泛的 API、工具和服务框架,定义了客户端和服务器之间的交互。
所有 Photon Realtime 客户端都连接到一系列专用服务器,分为三个不同的任务:身份验证和区域分配(名称服务器)、玩家匹配(主服务器)和游戏玩法(游戏服务器)。所有这些服务器都是通过 Realtime API 进行管理的,因此您无需担心它们 - 尽管了解它们肯定会有所帮助。
Photon Cloud 是一项完全托管的服务,为 Photon Realtime 客户提供全球托管。游戏代码与 Photon Cloud 通信,连接到云端,并使用其 API 执行连接、加入随机房间或引发事件等操作。
在 Photon Realtime 中,可以轻松保存和加载房间数据,并且可以设置 Webhooks 将 Photon Cloud 与外部 Web 服务器连接。
Photon Fusion 是一个用于 Unity 网络状态同步的新型高性能库。它支持两种根本不同的网络拓扑,以及一种使用单一 API 无需网络连接的玩家模式。
Fusion 的设计考虑了简单性,可集成到 Unity 工作流程中,并提供“开箱即用”的数据压缩、客户端预测和延迟补偿等高级功能。
例如,在 Fusion 中,RPC 和网络状态由MonoBehaviour
方法和属性上的属性定义,无需显式序列化代码,并且可以使用所有最新的 Unity 预制件功能将网络对象定义为预制件。
Fusion 使用现代压缩算法以最小的处理器开销来降低带宽要求。数据要么作为完整压缩快照发送,要么作为部分块发送,并随后实现一致性。在后一种情况下,提供了完全可定制的兴趣区域系统,允许非常大的玩家数量。
Fusion 实现基于刻度的模拟,并在共享模式或主机模式下运行。主要区别在于谁拥有网络对象的权限,但这反过来又决定了哪些其他 SDK 功能可用。
Fusion 的开发是为了取代 Unity 的两种现有 Photon 产品(Bolt 和 PUN)。 Fusion 的重要核心组件是NetworkRunner
和NetworkObject
。 NetworkRunner
可以被认为是Fusion的核心——场景中有一个运行器来管理网络操作和模拟。
Fusion 提供各种预构建的NetworkBehaviours
,用于快速游戏或原型创建。
Fusion 将输入处理分为两个步骤:从本地硬件收集输入并将其放入结构中,然后读取该输入以更改游戏状态(推进模拟)。
Fusion 支持 RPC(远程过程调用),适用于标准 Fusion 输入或使用[Networked]
属性不是最实用的解决方案的情况。要开始使用 Fusion,我们建议您学习Fusion 入门指南。
Photon Quantum 是一款用于多人游戏的完全确定性引擎。它基于预测/回滚方法,非常适合对延迟敏感的在线游戏,例如动作角色扮演游戏、体育游戏、格斗游戏、FPS 等。
使用该引擎时,不需要netcode;所有游戏元素默认联网且100%同步。您只需创建一个具有多个连接玩家的模拟,就像开发本地多人游戏体验时一样。 Quantum 的确定性子系统确保每个客户端上的模拟始终同步且无延迟,包括:物理、机器人、寻路、动画。
确定性游戏本质上是抗作弊的。打击作弊者是通过检查回放或服务器裁判模拟(最有效的反作弊措施)来进行的。
玩家输入被发送到 Photon Cloud 服务器,然后分发给其他玩家。 Webhook 可用于连接您自己的后端和插件,以便在服务器端执行自定义代码。
Photon Quantum 基于 ECS 架构构建,据称具有高性能,甚至可以在 PC、游戏机、VR 和手机上运行体力密集型多人游戏。
在 Quantum 中编码的模拟不依赖于 Unity,并且可以在任何地方运行。所有本地操作都会立即执行,并且远程输入会被预测和回滚。 Quantum 具有查看重播的功能。回放可以保存在后端或在游戏中使用。首先,您可以查看Quantum 100 系列。
Normcore 是一款高性能工具,用于向任何基于 Unity 的项目添加多人游戏模式。 Normcore 包括网络物理、持久空间、语音聊天和 XR 支持。
当您向 Normcore 添加RealtimeTransform
组件时,Normcore 会自动同步所有对象转换。这不需要任何编码。此外,Normcore 还提供与状态相关的插值和可靠的网络物理特性,可在任何连接中实现完美的运动。
Normcore 的主要优势之一是基于 WebRTC 的快速数据传输。它使用在传输过程中不会造成碎片的最大数据包大小,从而加快了数据传输过程。 Normcore中的所有数据包均默认加密,保证用户数据的安全性和机密性。
Normcore 还使用增量更新系统。这意味着它会跟踪自上一个数据包发送以来的所有更改,并且当需要发送新数据包时,它已经知道其中要包含哪些内容。这可以节省资源并提高性能。 Normcore 中的数据序列化功能可优化 CPU 使用率。所有序列化代码都是在项目编译之前自动生成的,确保快速高效的资源使用。
Normcore 服务器在全球多个地区运行,并通过专用光纤网络连接,提供低延迟。您可以在自己的服务器上托管 Normcore,或允许 Normcore 为您托管我们的云基础设施的私有副本。
Mirror Networking 是 Unity 的高级网络库,针对易用性和可靠性进行了优化。该库旨在简化使用网络连接的过程,使开发人员能够专注于创建他们的项目。
镜像网络与十几种低级协议兼容,并不断发展和改进。它包括通过网络进行远程过程调用和上下文管理的功能,并且还支持在网络应用程序中使用物理。
该库提供了十多个内置网络适配器和五个网络管理系统选项,允许开发人员创建自定义版本。还包括几个完整的使用示例,以方便学习和编码过程。
Heroic Labs 的 Nakama 是一款流行的开源游戏服务器,它允许您在一个开放包中拥有整个基础设施。 Nakama 包含所有必要的实时游戏 API 以及社交和竞技功能。
Nakama 配备了游戏所需的所有功能,例如实时多人游戏以及社交和竞技功能,允许您使用 Go、TypeScript 和 Lua 自定义客户端和服务器端的所有方面。使用 Nakama,您可以创建实时多人竞技游戏、自定义匹配算法、添加每日奖励、创建排行榜、实现游戏内货币并提供实时聊天。
Fish-Networking 是一个免费的开源库,用于 Unity 中的网络解决方案,由经验丰富的游戏设计师开发。它提供了一组广泛的功能,这些功能通常只有付费解决方案才能提供。
Fish-Networking的主要优点是带宽和资源优化(可以节省服务器成本)、支持大量玩家(从几十到几百)以及内置功能,例如客户端预测、延迟补偿、服务器负载平衡以及对嵌套网络对象的支持。
下表概述了用于 Unity 游戏开发的各种网络解决方案,并按所使用的协议、支持的拓扑、每个会话的最大玩家数量、支持的最低 Unity 版本以及截至 2023 年中期的当前状态对它们进行了比较。
解决方案 | 协议 | 拓扑结构 | 最大限度。每场比赛的玩家 | 最低 Unity 版本 | 地位 |
---|---|---|---|---|---|
实体的网络代码 | UDP、网络套接字 | Unity 中继、P2P、客户端托管、DGS | 100(Unity中继限制) | 2022.3 | 🧪 实验性 |
游戏对象的网络代码 | UDP、网络套接字 | 中继(通过 Unity Relay)、P2P、客户端托管、DGS | 100(Unity中继限制) | 2021.3 | ℹ️预发布 |
光子实时 | 可靠的 UDP、TCP、HTTP 或 WebSocket | 中继(通过光子云)、DGS | 32 | 2018.4 | ✅ 生产就绪 |
光子聚变 | TCP、RUDP、WebSocket | 中继(通过 Photon Cloud)、P2P、客户端托管、DGS | 200 | 2020.3 | ✅ 生产就绪 |
光子量子 | RUDP | 中继(通过光子云) | 32 | 2018.4 | ✅ 生产就绪 |
规范核心 | 基于 UDP 和 TCP 的WebRTC | 中继(通过 Normcore Cloud) | 100 | 2020 长期支持 | ✅ 生产就绪 |
镜像网络 | 网络套接字 | 客户端托管、DGS、P2P、中继 | 200 | 2020 长期支持 | ✅ 生产就绪 |
中间 | RUDP | 受服务器性能限制 | 2018.4 | ✅ 生产就绪 | |
鱼网 | RUDP、WebSocket | 中继、P2P、DGS | 200 | 2019.4 | ✅ 生产就绪 |
光子双关语 | UDP、TCP、WebSocket | DGS、中继、P2P、客户端托管 | 32 | 2019.4 | ⚠️ 已弃用 |
光子螺栓 | UDP、TCP | 点对点、分布式服务 | 50 | 2019.4 | ⚠️ 已弃用 |
大学网络 | TCP、UDP | 客户托管,DGS | 受服务器性能限制 | 5.1 | ⚠️ 已弃用 |
可用解决方案的多样性使开发人员可以选择适合其特定需求的工具。许多解决方案支持不同类型的拓扑,这使得它们能够适应游戏的特定要求。一些旧的网络解决方案,例如Photon PUN、Photon BOLT和UNET,已经过时,不建议在新项目中使用,而Netcode for Entities和Netcode for GameObjects仍处于实验或预发布阶段,这也尚未允许它们用于生产。