不管是端游还是手游,在游戏引擎提供的基本支持之上,一个项目,通常还是需要自己的逻辑层框架。今天,我们就聊一聊一个游戏项目基本的逻辑层框架组成部。这里以Unity3D引擎为例,但不限于Unity3D引擎。
资源管理
一个项目开始,最好就规划好资源目录。随着项目的开发,资源会越来越多,越往后,越难整理,而且需要耗费大量时间和精力,所以建议随着项目的开发,就不断地做好资源规划和整理的工作。
编辑器阶段
- 资源打包模块
对于Unity3D来说,主要是打包 AssetBundle
- 配置表导出模块
很多游戏的大量配置,使用excel的形式,所以必然需要一个工具能够将excel表结构,转为代码,并且把表数据,导出到游戏运行时能够解析的格式,例如二进制。还可以自动生成运行时加载解析代码。
- 协议导出模块
很多游戏使用了google的 FlatBuffers 或者 Protocol Buffers,这里需要一个工具自动化地将协议文件导出成客户端和服务器使用的代码文件。
运行时阶段
- 更新模块
这个模块主要是根据项目自定义的版本信息,从网络上自动下载需要更新的资源文件,以及代码文件,这里通常使用lua,然后解压到资源目录。这里面涉及到两个重要的东西,一个是版本和资源文件的定义,一个是HTTP请求模块。对于Unity3D,通常使用 UnityWebRequest
- 网络通信模块
TCP 或者 UDP,用于客户端和服务器的逻辑通信。收发包数据,根据协议号处理协议,具体处理函数为业务逻辑。
- UI管理器
如果是MVC结构,定义好UI面板的基类,各UI类继承基类。UI分层,普通UI面板层,弹出式面板层,Loading层,特效层,等等,具体根据项目需求灵活定义。
- 事件系统
用于整个工程的业务逻辑之间通信。不过事件这种东西,有一个不好处就是有时候调试起来不是很直接,有时候难以确定是从哪里发来的事件,有弊有利。
- 代码热更新模块
现在比较常用的解决方案是 lua,虽然写起来比较蛋疼,但是很多项目都这样用,也许是因为没有更好的解决方案,也许是因为技术决策者的经验之谈,这里就呵呵了。
- 原生交互模块
对于手游,通常分为Android和iOS版本,不同的版本有一些地方需要和原生系统交互,例如将游戏截图保存到相册,这样就需要调用原生系统的API。一些SDK的接入相关的东西,也可以归于这个模块。
- 一些小的工具类集合
- 配置表加载解析模块
就是将编辑器阶段打包好的配置表数据,在这里读出来,存起来,用于游戏业务逻辑使用
- 数据读写模块
有时候需要将一些数据写到本地,对于不同的平台,Android,iOS,PC,存储的路径不同,这个模块会将这些都封装好,上层业务只管用就行,不需要关心路径问题。
- 音频模块
游戏内音频播放及管理,例如同一音源,最多有多少个的控制,等等
- 日志模块
日志的打印,各平台写入文件,设备上在屏幕上显示下隐藏,等等