了解Edgegap的工作原理

了解Edgegap的工作原理

最易上手的 Unity 网络框架:NGO vs Mirror vs Fish-Net vs PurrNet

已发布

已发布

已发布

最后更新时间

最后更新时间

最后更新时间

最近一次准确性审核

最近一次准确性审核

最近一次准确性审核

最简单的 Unity 网络代码供游戏开发者使用

关键洞察

关键洞察

关键洞察

简短回答:对于大多数 Unity 多人游戏而言,Mirror Networking 可能是最稳健且最容易上手的起点。它是免费且开源的,拥有历经 10 年建立的庞大社区,并且采用服务端权威架构,改进了 Unity 内置 Netcode for GameObjects 的严格限制。

  • Mirror:免费、经 OSI 认证的开源、服务端权威架构、延迟补偿、文档丰富。

  • Fish-Net:针对变换(transforms)和刚体(rigidbodies)的客户端预测;延迟补偿为付费功能。

  • PurrNet:免费;使用普通的 Instantiate() 和 Destroy() 生成;权限在单个 Network Rules 对象中设置。

  • Netcode for GameObjects:Unity 的内置选项,具有明确记录的严格限制。

  • Edgegap 托管支持与所有这四种方案集成,包括 Netcode for GameObjects。

游戏开发非常复杂,其组成部分往往数量繁多,理解起来就像它们的名称一样错综复杂。在本指南中,我们旨在为初学者和独立开发者揭开游戏服务、工具和技术的神秘面纱。

首先从对多人游戏至关重要的核心开始:网络代码(netcode)。

理解网络代码对于打造引人入胜且无缝的多人游戏体验至关重要。让我们来了解一下它是什么、为什么重要,以及目前 Unity 中最简单、最有效的网络代码实现方案。

什么是网络代码(Netcode)?

网络代码是一个涵盖电子游戏(特别是多人游戏环境)网络层面的术语。它是负责玩家设备与游戏服务器之间数据交换的技术,这种交换被称为“同步”,它能确保一名玩家执行的操作能够立即、准确地反映在另一名玩家的游戏环境中。

由于全球玩家面临不同的延迟和连接质量,这种同步极具挑战性。高效的网络代码会考虑到过时或不够理想的玩家设备配置,力求提供公平、流畅的游戏体验。

网络代码还在通过安全处理数据来维护游戏完整性方面发挥着至关重要的作用。

为您的游戏选择合适的网络代码

选择合适的网络代码是游戏开发中的关键决定。选择在很大程度上取决于您的游戏类型、游戏机制以及预期的玩家群体规模。

  1. 客户端-服务器模型 vs. 点对点(P2P):P2P 常用于规模较小、对延迟不太敏感且通常非竞技性的游戏中。它直接连接玩家,减少了对中央服务器的需求。相比之下,客户端-服务器模型中玩家连接到中央服务器,更适合需要第三方服务器权威来执行游戏规则和保障安全的大型竞技游戏。但是,P2P 特别会引入安全隐患,游戏开发者在选择将其作为架构时需要注意这一点。

  2. 考虑游戏类型:像射击游戏这样的快节奏游戏需要更稳健的网络代码来处理玩家的快速操作,并确保所有客户端保持同步;而策略游戏的要求相对宽松,可以利用预测技术来支持延迟较高的对局。

  3. 可扩展性:预见您游戏的发展。可扩展的网络代码可以应对不断增加的玩家数量,而不会牺牲性能,也不会导致托管服务商账单激增。

  4. 安全与公平竞争:确保您的网络代码能够防范常见的作弊和外挂,以维持公平的竞技环境。

构建多人游戏:初次使用网络代码的体验

对于初学者,Unity 提供了一个易于使用的网络代码实现平台,名为 Netcode for GameObjects。让我们来分解一下基本步骤:

  1. 理解 Unity 的网络代码:Unity 提供了一套强大的网络工具。请熟悉 Unity 的网络组件,例如 NetworkManager 和 NetworkObject。

  2. 搭建基础网络:从创建简单的客户端-服务器架构开始。Unity 的教程和文档是迈出第一步的绝佳资源。

  3. 同步 GameObject:学习如何在不同的客户端之间同步游戏对象。这包括玩家角色和游戏世界中的交互元素。

  4. 处理玩家输入:确保玩家的输入能够在所有客户端之间有效传达和反映。

  5. 测试:定期在各种网络条件下测试您的网络代码,以确保其可靠性和性能。

更进一步:更好的网络代码替代方案

Netcode for GameObjects 众所周知存在严格的局限性。具体来说,有三种社区制作的网络代码解决方案脱颖而出,各自为游戏开发者带来了显著的改进。其中两个是历史悠久的开源项目:拥有 10 年历史的资深项目 Mirror Networking 和 Fish-Net Networking。第三个是 PurrNet,作为新晋方案,因其对开发者友好的设计而备受关注。

Mirror Networking

Mirror 是 Unity 历史最悠久的开源网络库,源自 Unity 曾经原生提供但现已弃用的 UNET。它运行在具有服务器权威的客户端-服务器拓扑上,这意味着服务器是游戏状态的唯一权威数据源——这是任何需要有效反作弊保护的游戏的前提条件。

Mirror 是经过 OSI 认证的开源项目,文档丰富,并拥有庞大的社区。它开箱即用支持延迟补偿(适用于射击游戏中的命中判定)、感兴趣区域(Area of Interest,用于控制哪些客户端接收关于哪些对象的更新)、Steam 和 Epic 传输层、WebGL 构建的 WebSocket 支持,以及 Multiplex Transport(多路复用传输),以便单个服务器可以同时接收不同传输层上的客户端。

在决定使用之前,有几点值得了解。Mirror 采用单例 API 设计,这意味着每个可执行文件只能运行一个网络核心实例。这对于大多数游戏来说完全足够,但会限制某些高级架构。此外,它没有正式的长期支持(LTS)计划:历史上其 API 的变更速度有时需要在版本之间更新代码。对于正在积极开发的游戏来说,这意味着需要时刻留意更新日志。

使用 Mirror Networking 的知名游戏包括《Population: ONE》、《Zoomba》(在 Google Play 上拥有 1 亿次下载)以及由前《魔兽世界》开发者制作的《Unleashed》。

PurrNet

PurrNet 是一个免费开源的 Unity 网络库,其开发者认为现有的解决方案往往违背了 Unity 的自然工作流程,而不是去契合它。其核心理念非常直观:如果您已经知道如何使用 Unity 和 C#,就应该能够直接构建多人游戏,而无需学习一套完全不同的工作方式。

它有几个突出的特点。首先,生成(spawn)和销毁(despawn)的工作方式与 Unity 原生完全相同。您只需调用 Instantiate() 和 Destroy(),PurrNet 就会处理网络同步。没有特殊的生成调用,没有额外的步骤。其次,权限通过单个 Network Rules 可编程对象(ScriptableObject)来控制,而不是硬编码在您的游戏代码中,这意味着您可以在原型制作阶段使用完全的客户端权限,随后无需重写任何内容即可切换为服务器权限。第三,没有烘焙步骤。场景 ID 是在运行时根据层级视图顺序计算的,这彻底消除了一整类版本控制冲突以及使用其他解决方案的开发者经常遇到的神秘构建问题。

在 RPC 方面,PurrNet 支持泛型、静态和可等待的 RPC。可等待的 RPC 允许您在服务器上调用方法并直接等待返回值,类似于常规 C# 中 async/await 的工作方式。它还附带了一个持久化玩家数据系统(其“cookie”系统),使服务器无需任何自定义代码即可将重新连接的玩家识别为同一人。

PurrNet 是 100% 免费的,没有付费档位。没有收入分成,没有前期费用,也没有任何被付费门槛拦截的核心功能。

Edgegap 提供了针对 PurrNet 的完整集成教程,演示如何将您的 Unity 项目连接到专用游戏服务器:

Fish Networking("Fish-Net")

Fish-Net Networking 是一种专为在线多人游戏设计的网络技术,注重适应性和可扩展性。对于希望使用能紧跟更严苛游戏类型需求的社区维护工具的开发者来说,它已成为首选推荐方案。

Mirror 保持简单直接,而 Fish-Net 则致力于走得更远。它同时支持变换(Transform)和刚体(Rigidbody)的客户端预测——当您在构建快节奏竞技游戏时,这种功能至关重要,既能确保移动操作响应即时,又能保持服务器的权威性。延迟补偿作为付费功能提供,无论玩家延迟如何都能实现精准的命中判定。对于更大的游戏世界,感兴趣区域(Area of Interest)支持让您可以精确控制哪些客户端接收关于哪些对象的更新,从而有效控制带宽消耗。

Fish-Net 还拥有正式的长期支持(LTS)计划和 API 更新稳定性保证,这意味着您可以升级版本而无需担心现有代码损坏。它采用基于实例的 API 设计而非单例模式,允许单个可执行文件充当多个服务器或同时连接到多个服务器。这对于更高级的架构至关重要。

其他一些实用细节:Fish-Net 支持免分配(allocation-free)传输以获得更好的大规模垃圾回收性能,支持堆叠和附加场景(适用于单个服务器上的副本地牢或独立游戏房间),并且除了 Steam 和 Epic 之外,还开箱即用支持 Unity Transport 和 Photon Transport。

Fish-Net Networking 的优势包括更强的可扩展性、更低的服务器负载,以及在处理玩家数量波动时更高的稳健性。

使用 Fish-Net Networking 的游戏包括《Arcadius》、《Fight Action Sandbox》、《Reign of Dwarf》、《Cat Warfare》、《Skygard Arena》以及许多其他已发布和正在开发中的游戏。

网络代码最佳实践

  1. 针对延迟进行优化:采用延迟补偿和预测等技术来抵消延迟问题。

  2. 安全措施:定期更新您的网络代码以防御新的漏洞和外挂。攻击者最喜欢针对最流行的库,因为它们影响的用户群体最大。

  3. 可扩展架构:将您的网络代码设计为可扩展的,以平稳容纳不断增加的玩家。尽量减少需要同步的对象和属性数量,并考虑游戏设计允许的最坏情况。

  4. 反馈机制:实施反馈机制以监控性能和玩家体验,从而实现持续改进。

  5. 经常测试:以易于重新运行的方式实施端到端测试和负载测试,无论何时对游戏进行重大更改都可以轻松复测,让您确信下一次更新不会招致差评。

结语

掌握网络代码是一段充满挑战和学习机会的旅程。

通过选择合适的网络代码、理解 Unity 的工具、遵循最佳实践并利用现有资源,您可以打造出引人入胜且流畅的多人游戏体验。

在选择好网络代码之后,让游戏上线的下一步就是决定托管方案。幸运的是,Edgegap 已与包括 Mirror、Fish-Net 和 PurrNet 在内的热门插件进行了集成。您可以观看上方的视频,或前往它们各自的文档了解更多信息。

--

Mirror 和 Fish-Net 的功能对比数据部分来源于社区维护的《Unity 网络解决方案电子表格》(该表格最后审阅于 2025 年 4 月,现已不再积极维护)。

书写者

Vincent Archambault,Edgegap 的首席科学官

Get your Game Online Easily & in Minutes

立即开始集成!

轻松在线游戏
且在几分钟内