前言
本文是一个使用Unity和C#来开发一个比较简单的PC端MMORPG(多人在线角色扮演游戏)。本文是个刚入门不到一年的新手大学生,边写项目边写文章的总结性文章,质量不高,供unity新手参考,高手请绕道。MMORPG是种网络游戏,所以一个网络游戏该有的服务端、客户端双端架构是必须的。至于是B/S(Browser/Server,浏览器/服务端) 架构 还是 C/S(Cilent/Server,客户端/服务端)架构,要看是不是打算在浏览器上发布。我们这里采用目前比较流行的C/S架构。
开发工具
Visual Studio 2022(需安装好 dotnet 6.0、使用unit的游戏开发、通用Windows平台开发)
Unity 2020.3.33flc2 LTS
Visio 2019
Excel 2019
SQL数据库或MongoDB(没确定,可能都用)
其他后面写
前期分析
作者已经默认你具备一定的C#语言和Unity的使用经验以及计算机专业相关知识。所以废话少说直接开始分析。做MMORPG游戏开发之前我们先要确定一下需求,在这一步我们的工作有这些:游戏用什么样的?游戏要开发哪些模块?这些模块的作用是什么?主要实现什么功能?模块与模块之间的数据流向是怎么样的?这些模块拼起来的游戏流程是怎么样的?
比较常见的RPG网络游戏通常有这几个功能模块:登录与注册,角色,技能,NPC,物品,商店,剧情,背包,音效,多人聊天,怪物,怪物战斗,任务,地图,好友,组队。如果是大一点的商业级MMORPG的话,还会有交易、拍卖行、公会、时装、公会战、充值、抽奖等等功能模块。
然后一个RPG网络游戏不仅有这些功能模块,还要有给这些功能模块做支持的非功能模块(玩家接触不到的模块),例如方便游戏开发的各种编辑器,如角色编辑器、剧情编辑器、任务编辑器、地图编辑器等等编辑器模块、导入游戏数据的数据配置模块、负责实现代码、资源的热更新模块、负责网络传输的网络模块、负责控制服务器时间的计时器模块、以及各种程序相关配置的配置模块。
这些是按代码的各种功能来划分模块的结果。实际上,在软件工程里负责降低代码与代码之间的耦合性不止与模块划分法这一种。实际上还有层次化、设计模式两种。
接下来讲层次化,我们可以把一个RPG网络游戏按照代码执行的各种层次进行划分,它的好处是不同层次是不同的抽象等级,每一层只负责单一的部分,每层的人只负责这一层的知识,与上一层或下一层的人对接就行了,就像我们可以把世界的物质划分为 原子层面的物理、分子层面的化学,有机大分子层面的生物学,某种人型生物层面的历史学。我们可以将现实世界按这样的层次进行划分,物理学家只负责物理层、化学家只负责化学层这样。一步步将复合、具体的知识分解成一个特定领域的专业化知识。层次化的缺点就是随着层次逐渐提高,每层细节在传递的过程中,信息不断丢失,沟通的成本不断提高,性能开销逐渐增加,层次划分难度也越来越高。所以我们不要分层分得太狠。当前在软件工程里的的分层的方案有很多,UI交互部分的层次划分有MVC(Model View Controller,模型、视图、控制器)、(MVVM,Model View ViewModel,模型、视图、视图模型)、MVP (Model View Presenter,模型、视图、发布器)三种。MVC和MVVM在unity用的不多,MVP用的比较多,有的人把MVP称作MVE(Model View EventSystem,模型 视图 事件系统),MVP架构模式是 MVC 的一个变种,很多框架都自称遵循 MVC 架构模式,但是它们实际上却实现了 MVP 模式。
程序内部的层次划分有
根据OOP(Object-Oriented Programing,面向对象编程)思想来实现的三层架构(View Service Dao,视图 服务 数据访问)是被广泛使用的客户端和服务端层次划分方案,不过通常会根据软件的特点进一步划分为四层或五层。
根据DOD(Data-Oriented Design,面向数据的设计)思想来进行分层的有ECS(Entity Component System,实体组件系统)是1990年代就出现过的,GDC2017大会后逐步火热的客户端和服务端游戏层次划分方案,优点是CPU利用效率高,开发难度初高后低,缺点是目前不成熟,可能开发时间较长。
根据SOA (Service-Oriented Architecture,面向服务的体系结构) 思想实现的微服务(Micro Services)是目前被广泛应用在互联网企业服务端的层次划分方案,优点是并发高,缺点是延迟比较高。
最后是设计模式,设计模式是前人在软件开发过程中对一些固定问题做出的一套富有经验性的解决方案,我们碰到相似的问题和条件直接套用这种设计模式就行了,其实上文的哪些分层方案也算是设计模式的一种,对于传统的OOP来说,设计模式共有23种,我们常用的设计模式有 观察者模式、单例模式、抽象工厂、简单工厂、外观、访问、迭代器、组装、享元、组件这几种。实际商业项目中当然会用到更多,只是频率不是非常高。
通过以上的分析,相信你大概知道我们学习MMORPG开发将会用到的模块划分与解耦方法。我打算用上文提到的MVP和三层架构以及单例、观察者、享元等来设计本次的简单MMORPG游戏。游戏将包含以下几个功能模块:登录\注册,角色,技能,NPC,物品,商店,剧情,背包,音效,多人聊天,怪物,怪物战斗,任务,地图,好友,组队。非功能模块包含:基于Excel的数据转Json的工具,从Json加载游戏各项数据的配置模块,基于行为树的AI模块,基于KCP或TCP的通信模块,基于Protobuf的数据传输模块,基于HTTP的热更服务器模块、基于XAsset的资源热更新模块、基于huatuo的代码热更新模块、计时器模块、服务器加载模块。