在游戏开发过程中,除了逻辑功能的开发之外,还有非常多基础的模块。这些模块,对大部分手机网络游戏来说都是一样的。所以,在上个游戏已经上线运营大半年之际,我认为有必要将这些模块整理出来。让后面其它游戏的开发,能够不用从0開始。该游戏client採用Unity3D开发,那么我们这里抽取的基础组件也就是针对Unity3D引擎来的。
简单的梳理之后,我发现主要有下面一些模块,能够独立抽取出来,当然各个模块之间也有一个依赖关系。比方日志模块,差点儿是全部模块都须要依赖的。
1、日志模块
游戏开发中,我们避免不了日志打印,由于有些时候。我们须要输出一些信息或者进行一些调试。
所以。一个方便的日志组件能够事半功倍。当然,你也能够直接使用unity自有的Debug.Log。
可是我们希望抽象出来一套日志接口。为了更方便的控制和扩展。
2、资源读取模块
游戏开发中。我们有非常多的资源。包含lua脚本,游戏配置表,assetbundle等。
在研发的过程中,资源的改变是常事。所以,在研发的过程中,我们直接读取本地的资源。这样假设资源进行改变之后。里面就能够反映在Unity编辑器中。上线或者内部提供的Debug版本号,我们採用资源更新的方式,同一时候,我们会将资源碎文件打包到一个归档文件(MPQ)文件里。然后游戏须要资源的时候,会从MPQ归档文件里读取。
所以,我们的资源读取模块,主要提供一个统一的资源读取接口,调用者不用考虑当前资源是从本地文件还是MPQ归档文件里读取到的。
3、资源更新模块
手机网游在玩家启动游戏之后。会有一个资源更新检查,假设有资源更新,则下载须要更新的资源。这也是如今主流网络游戏的开发模式。主要避免频繁的更换client。资源更新模块逻辑比較单一,就是获取server一个清单文件,然后依据清单文件,下载全部须要下载的资源文件。为了更好的体验。我们支持断点下载。
4、本地资源解压模块
当我们首次发包的时候,我们通常会把全资源打到终于的包中。这样也是为了让用户下载完毕之后,不用再次更新一个非常大的资源。后面紧紧在有须要更新的时候,才採用增量更新的方式进行下载。所以,第一次我们将资源放在终于的包中。我们须要将资源解压到一个可读写的存储文件夹。后面增量更新的时候。我们下载的资源也一样放在这个位置。
5、UI状态管理
网络游戏中。有非常多UI时。我们须要对打开的UI和UI跳转进行管理。
我们能够採用一种相似状态机的方式来管理UI。以及完毕UI界面的切换
6、Socket/Http通信组件。以及协议相关组件
网络游戏,自然少不了和server的通信。如今我们一般採用socket长链接的方式。当然。如今手机游戏的开发。也有非常多採用Http的方式,也有非常多游戏中两种方式都存在。
7、lua集成
如今为了做热更新,一般游戏逻辑,我们採用lua来开发。
所以。我们须要继承lua。如今集成lua能够有非常多选择。什么ulua。kopielua,slua等。这里都是大同小异,看自己的选择吧。关键能够做一个简单的封装,让lua逻辑的编写採用统一的格式。
8、UI控件事件的封装,方便lua中使用
依据你选择的lua插件,能够对UI中的事件做一些简单的封装。使得事件和回调在lua中能够更方便的处理
9、MPQ资源打包和读取组件
之前。我们说过。为了降低碎文件。我们在公布增量更新的资源的时候,我们首先将全部须要增量更新的资源。打进一个mpq归档文件里。
所以,我们须要两个组件。一个是MPQ打包工具,另一个C#中MPQ文件读取组件。
10、多语言文本文件处理
随着游戏的火热,我们对海外渠道的支持,也是能够预见的发展。
所以。我们在开发的时候,就须要想好多语言的支持。这里除了unity本身模型和纹理等的支持,我们另一类比方游戏中各种tip提示等,也须要做多语言支持。
11、渠道SDK统一API
国内大环境是上线时有N个渠道SDK须要接入。这里我们在Unity中抽象出一套统一的调用接口。屏蔽android和ios等平台的差异,然后提供android平台的支持,和ios平台的支持。至于SDK本身的接入。和渠道包的打包等我们採用U8SDK的方式来做。
12、对象池
手机游戏对于用户体验有着较高的要求,所以我们在游戏开发过程中,须要採用一定的技术来缓存一些经常使用的组件,让游戏的性能体验更加完好。
这里。方案之中的一个就是採用对象池技术。
对象池本身的实现和详细的游戏无关,能够独立成一个组件
13、AssetBundle管理
游戏中,之前我们说过。我们是将资源打包成assetbundle。然后通过热更新下来。
所以,游戏中我们须要从assetbundle中完毕资源的读取和实例化。
所以。为了更方便更好地读取资源。我们能够对assetbundle进行统一的管理
14、其它基础组件和相关经常使用函数的整理
游戏开发中还有非常多其它经常使用的辅助函数等,我们也能够提取出来。 比方unity单例,多线程同步。MD5。IO操作等。
这些就是眼下整理出来的一些比較通用的点,也希望通过这个整理,让后面新游戏的开发,有一个略微基础的起步。不用从0開始。 整理完毕之后。我们大概的代码结构例如以下:
后面。我会将各个组件的实现大概说一下,也当给自己做一个纪录。这套东西。后面随着时间的推移和经验的积累,可能还会增加很多其它的功能。