用Netcode for GameObjects制作我第一款多人游戏

ESTEBAN MALDONADO / UNITY TECHNOLOGIESSenior Developer Advocate, Multiplayer Solutions
Oct 26, 2022|13 Min
用Netcode for GameObjects制作我第一款多人游戏
为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。

我叫Esteban Maldonado,是Unity的开发者倡议人。我的工作是宣传Unity Gaming Services、制作新的学习材料,让开发者能在自己的开发之旅上使用这些工具。

这些工具里就有Netcode for GameObjects(NGO),由Unity为引擎开发的中间层联网库。网码方案对任意多人游戏项目都非常关键。

Unity开发者倡议人的主要职责之一便是制作展示工具的样例游戏,我则被指派了一款NGO样例:《Galactic Kittens》

不过,尽管我已经在游戏行业积累了不少专业知识,我本人却缺少制作多人游戏的经验。所以这个项目不仅为开发者们提供学习机会,也成了我自己的一次学习经历。

我与团队一起完善了《Galactic Kittens》的游戏概念,比如游戏的难度、基本的游戏机制、角色技能(后被移除)等等。

为了完成这个样例游戏项目,我与Bromio富有才华的团队合作,用精细的美术资产、音乐、SFX和额外的编程支持来将游戏化作现实。我们所有人的目标是为开发者提供一款简单、对新手友好的入门教程,帮助开发者用Netcode for GameObjects制作多人游戏。

在本文中,我将介绍《Galactic Kittens》从原型到稳定版的开发历程,以及如何利用样例来启动你自己的多人游戏项目。

《Galactic Kittens》是什么?

在我深入开发之前,这里是我们新样例游戏《Galactic Kittens》的快速概述。这个样例是一个2D合作太空冒险,旨在帮助你学习一些多人联网的基础知识。

它将教授多人游戏开发的必要技术,如:

  • 带有自动场景切换的联网游戏管理
  • 基本的2D移动同步,包括精灵表的变化
  • 在服务器端的运行时生成游戏对象
  • 将主要玩家的所有权从服务器转移至客户端
  • 在所有客户端上生成VFX
  • 在所有客户端播放音效和音乐
  • 交换玩家和游戏统计数据(如血量、打败的敌人数等等),并将其展示在游戏UI上

你可以在我们的网页上详细了解《Galactic Kittens》,或直接从GitHub下载项目并探索代码。

《Galactic Kittens》是怎样建立的呢?
边开发边学习

尽管我在制作多人游戏上没有太多经验,Unity提供有许多公开资源来帮助用户上手NGO。

有了这些资源,我首先在Unity Multiplayer文档里熟悉了下基本的联网概念和术语。接着,我学习了“Hello World”项目教程和几个小样例来做出一些成果。

在多次试错后,我终于从零做出了一个简单又基础的原型。

没错,这就是我最早做出来的《Galactic Kittens》。

到这里,游戏没有自定义房间,没有真正的UI,没有真正的网络连接管理——你可以想象到它的样子。原型只包含两艘相同的飞船(每艘有三点生命值),飞船可在屏幕上移动,按下空格则能发射方块子弹。原型仅能展示在多个客户端生成对象、同步运动。

我只开了个头,而Bromio会帮助我们完成整个项目,将它做成可使用的样例。

从原型到太空探索游戏

在最初的进展后,我开始与Bromio合作将原型完善成可用于生产。和我一样,他们也没有太多开发多人游戏的经验,但仍接受了挑战,帮助我们达成目标。

为了更高效地工作,我们将游戏拆成几个单独的部件,同时进行开发:美术们制作资产,程序员们编写游戏的核心逻辑。

以下是《Galactic Kittens》美术风格的演变。

同时,Bromio的主力开发者和我在完善《Galactic Kittens》功能时发现了许多有趣又有挑战性的地方。

网络连接管理

开发期间最大的难题在于网络连接管理和角色选择。我们不得不将角色数据储存到单独的ScriptableObject文件里,你在下载项目后就能看到。

这些文件包含着每位太空探索者的必要信息,包括UI上显示的精灵(玩家和飞船),以及游戏场景开始时需要为玩家生成的预制件。

在角色选择界面,最大的难题在于检测客户端断开连接并通过UI处理该事件。

我们还决定让玩家不能选取相同的角色,并向开发者演示了相关做法。(让玩家选择相同的角色其实更简单、限制更少。)

《Galactic Kittens》的角色选择界面。

网络连接的下一个难题是处理玩家在游戏期间断线。游戏不仅要处理玩家离开游戏,还要防止其他玩家在中途加入游戏。我们决定让连接管理程序只在主机位于角色选取界面时允许新玩家接入。当然这并非“万金油”式的方案,也有游戏允许玩家在开始后加入,这取决于游戏体验更适合哪种方式。

基本敌人

我们想让游戏玩法简单一些,所以就没有给敌人和陨石加上复杂的AI或行为逻辑。如此一来,开发者便不会分心,能专注于NGO库的使用方法。

于是,游戏里只有两种主要敌人和一种陨石障碍:

太空射手 太空幽灵 陨石

两种敌人都会随机选择运动路径,并且只有太空射手会发射激光回击。你可以参考这份开发者指南来详细了解这些敌人的构成,并加入你自己的逻辑。

首领战

在制作最终首领战之际,所有制作游戏房间、飞船行为和敌人而积累下来的经验让我们得以快速完成工作。

一个特别的难题是首领出现前玩家听到和看到警报的时机。我们最终采用了客户端与服务器的RPC来发送事件,提示普通游戏体验已经结束,首领战就要开始了。

《Galactic Kittens》样例游戏“警告”GIF

首领的行为采用有限状态机(FSM)制定,它会随机选取几套攻击动作来攻击玩家。这里,我们写了一份C#类叫做BossController,它会处理首领状态间的转换。你可以在开发者指南中查看关于这场战斗背后代码的信息,以及如何添加你自己的首领状态。

一路走来的帮手们
多人游戏社区

我们成功建立这款样例游戏的首要资源是加入了Unity 多人游戏网络Discord频道并向社区提问。我们在这里接触到了许多正在开发多人游戏的开发者,以及Unity多人游戏服务的创作者。大家带来的大量知识对于完成我们的目标来说绰绰有余。

多人游戏文档

在Unity工作的我有机会与熟悉联网技术的人合作,他们都非常努力地在开发实用资源和文档,来帮助每一个人上手多人游戏开发。Unity多人游戏文档页多次帮到了我,让我熟悉了从基本的网络术语处理延迟再到实际使用NGO的过程。

接下来要学什么?

我们对Galactic Kittens感到非常兴奋。也期待即将接触NGO的大家利用这份样例为自己的多人游戏学习之旅定下正确的方向。欢迎随时在Discord频道论坛中提出问题或提供反馈和建议。

我个人非常想学一学怎样把对象池加到多人游戏样例里。这个技术能让你预先为重复生成的对象分配内存。在早期实验阶段,我曾在离线Unity项目中尝试过这种技术,而它切实地提高了游戏的运行效率。这项技术也被用在了Boss Room和其他UGS样例中。

怎样开始学习多人游戏开发?

如果你想开启自己的多人游戏之旅,我们团队提供的大量资源能让你走得更轻松。

我推荐你首先查看Netcode for GameObjects页面,熟悉下相关软件包。然后,你可以在Galactic Kittens样例中探索NGO,或用微型样例一小步一小步地学习。

如果你正在开发的路上,推荐你加入Unity Multiplayer Networking Discord频道、逛逛论坛。如果你觉得Galactic Kittens过于简单、完全算不上个挑战,那就来了解下Boss Room, 这款全3D的样例游戏,它有着成品级的NGO开发水准。

在上线游戏方面,Unity Gaming Services能帮到你更多:你可以添加Lobby游戏房间或Matchmaker匹配服务,用Vivox加入语音及文字聊天,甚至用P2P直连的Relay Game Server Hosting等游戏托管方案。祝创作愉快!

要想了解最近及未来的多人游戏趋势,请阅读2022 Unity Multiplayer Report,报告搜集了来自美国、英国、日本和韩国超1500名玩家的问卷调查结果。