大家好,

作为一个业余项目和我的第一大型游戏项目,我花了很长时间在一个想象中的MMO上工作。

这篇文章的TLDR是,大规模项目是大规模的(并且在其他新闻中,水是湿的,草是绿的),但我想花点时间谈谈我的经验。在这篇文章中,我将谈谈如何结构化的事情、我能实现的内容以及出现的明显问题。我希望这些信息对考虑类似项目的人有用,并且如果你属于少数人,需要被说服,那么制作一个MMO可能不是你想要的。

我开始时为自己设定了一个成功的目标。这样做真的很容易做到,当你还控制着目标线的位置时。我的目标是完成一个MMO项目,而不是完成一个MMO项目,而是看看我能走多远,并在途中开发一些新技能。我选择了Unity作为我的引擎,以便我可以继续使用C#进行开发。

我认为MMO的结构最重要的是其扩展能力。如果游戏非常忙碌,那么可能需要很多实例服务器来支持大量的地下城探险队。不同的大陆区域可能需要专门的服务器,如果它们在游戏中忙碌到一定程度。远离大陆地区的地区可能可以靠一个服务器来处理。游戏如果是鬼城,那么可能只需要一个服务器。早期决定整体结构意味着我可以避免后来完全重设计的麻烦。基于此,我选择了3种服务器的结构:登录(管理用户登录并指引客户端可用的服务器),域(给定分片的中心管理者),地图(负责地面游戏世界和/或实例区域)。登录服务器访问Realm服务器目录,每个Realm服务器都支持至少1个地图服务器。一个地图服务器可以支持多个大陆区域或地下城实例。

我还没有决定使用哪种存储技术,我不想直接从Unity访问数据库,而且我已经有了一个用于另一个项目的API模板,所以我将每个数据库表都放在API端点后面。我建立了3个API:目录(由登录服务器读取并由Realm服务器报告)、世界(包含全球世界数据,如物体位置,供所有Realm服务器使用)、Realm(包含域特有的信息,如角色位置)。为了从Unity项目访问API,我建立了一个事件总线系统,使工作线程可以方便地进行异步调用并将结果报告给主线程。将API端点结构化为表后,我花了很长时间才做出决定,因此我最终查看了源代码中的代码生成(以确认措辞,生成是确定性的,而不是“人工智能”驱动的,它基本上是很高兴地接受了我已经建立的模式,我可以将其放入StringBuilder)。使用代码生成使我能够轻松地生成基本的CRUD端点来实验数据库表。

各种游戏服务器和API都由Docker的Compose插件管理。使用Unity的FishNet库,我能够组装出一个能够在本地测试中保持稳定的结构。用户可以登录世界并在数据库支持的信息下移动小胶囊角色之间的世界区域。用户有一个基本的库存系统,支持组合和拆分物品堆栈。我的初步党派系统允许玩家进入实例,并实例将在空置太久后自动终止。为了方便调试,我还实现了一个HTTP服务器,它在地图服务器上运行(例如,用于细调门户位置或重置卡住的玩家的位置)。理论上,这个HTTP功能也可以用于环境中的任何后台工作线程发送通知,以影响玩家体验。我还创建了我的第一个NPC,具有小巡逻路线和基本攻击行为。

当我完成了这些进展时,我开始思考更大的图景以及这意味着什么。

  • 作为服务而不是仅仅是一个游戏意味着,最终一个活跃的系统需要监控和可能的人类注意。每个用于维护的时间都意味着减少用于开发新系统的时间。与我假设的单机开发不同,一旦在周六凌晨1点出现了服务器问题,就不能简单地将其归结为周一问题。说不定还有假期!

  • 新系统仍然需要实际数据来呈现游戏结构。

  • 当前游戏是世界的立方体和胶囊。创建资产和/或找到合理的可用资产并将它们整合起来似乎是一个完全不同的生物体,而我所做的大部分都是代码/UI工作。
  • 设计一个具有大型世界的游戏意味着比普通项目更需要处理的资产。
    即使我能够神奇地一致地输出完美的组件,永远不会需要修改或从它们转变,组件的数量也是巨大的。
  • 将此乘以很多组件还需要世界建造工具来方便地管理元素。虽然我对数据库表结构和API端点的结构非常高兴,但我也绝不会手动创建每个JSON payload来管理它们。如果我雇用更多的人来创建内容,我可能会在手中扔出一把火。

上述问题可以通过雇用更多的人来缓解,但即使我神奇地拥有了资源,我也会遇到另一个问题。作为一个业余项目的乐趣之一是设计和编程的乐趣。如果我雇用了更多的人,我肯定还会做一些设计,但我必须花时间成为经理,以便其他人可以做编程。

我有很多乐趣与这个业余项目。它是无限范围的伟大兔子洞,我能够开发许多工具、结构和技能,这些技能对其他游戏或一般项目都很有用。按照我为自己设定的目标,这是一个绝对的成功。但是,如果我有选择的话,我几乎肯定会选择做这个项目作为全职工作。

为了真正确定这一点,我觉得我一直在保持这一篇文章的技术性。甚至没有提到吸引和保留用户社区的想法来让一个MMO在可玩状态时起飞。

我可能会时不时地继续这个项目,但我的下一个主要项目将一定会有一个可达到的范围。