写在前面
从微信小游戏出生(2018年初)到现在,已经使用CocosCreator一年多了(之前做手游主要是cocos2d-x+lua),趁着这段时间有空,想着整理出一个基于CocosCreator游戏开发框架。
这个框架主要是将我在开发过程中觉得好用的结构和模式、插件,以及在论坛上和博客上参考大神们的教程和想法(有些是直接拿来用),整合在一起的。一方面想提高开发效率,另一方面大家发现问题及时提出及时讨论,慢慢优化和改进。
框架工程是否跟游戏工程分开
在开始之前,因为这个问题纠结了好久。框架工程跟游戏工程分离,框架工程作为一个独立代码库,仅仅作为游戏工程的子模块,这样代码库可以统一管理。
我上个项目就是这样做的,但是你会发现,把框架模块单独拿出来给下一个项目复用,里面有一些耦合了游戏工程的代码。如果要每个成员在紧张的游戏开发过程中保持清醒,去保持框架模块的独立性,肯定是一个蛋疼的过程。
后来阅读了两篇文章(关于游戏设计模式的)之后,确定了该框架仅仅作为一个“纯净”的基础框架,每开一个新项目就拷贝过去,然后根据游戏的需求自己去调整。
两篇文章的链接在下面,有兴趣的可以了解下,不扯远了,准备进入正题!
正文
目录细分和规划
如下图:
- animClip:存放动画文件(.anim)
- font:存放字体文件
- prefab:存放不需要动态加载的预制体
- texture:存放用于贴图资源
- texture/ui_common:存放公用的ui资源图集文件。
- texture/ui_module:每个功能/模块单独用到的资源打包后的图集文件,比如main场景单独用到的打包一起,然后mian场景勾选自动释放资源,切换场景时就会自动释放没用的资源(前提是没有被其他的地方引用到)。
- resources:存放一切需要用于动态加载(cc.load.loadRes)的资源
为什么有些资源放在resources里面,有些放到外面?
先看官网的解释:
总结一下:
1、resources文件夹中的资源可以跟它外部的其他资源,相互引用,所以放哪,问题不大。
2、只有放在resources文件夹的资源才能用cc.loader.loadRes动态加载。
3、构建时,resources文件夹中的所有资源连同它们关联依赖的resources文件夹外部的资源,都会被导出,并且项目中无用的资源将会在构建的过程中自动剔除。
4、resources文件夹的资源,会增大包体和settings.js的大小,JSON的自动合并策略也将受到影响,无法尽可能将零碎的JSON合并起来。
框架模块介绍
# 配置表模块
直接在现有的插件excel-killer的基础上做了小调整。
plugins-excel/excel
:存放excel表
plugins-excel/excel-ouput
: 存放执行插件后的js输出文件
assets/script/data/config
: 执行插件后,会自动把js文件从plugins-excel/excel-ouput拷贝到此目录
let cfgman = require('CfgMan');
console.log(cfgman[1].name); // 小明
# 数据模块
IDataModel.ts
:数据模块基类,主要功能:读取数据表、读写本地缓存数据、网络数据交互。
LoadStorage()
:将该模块的本地缓存数据读取到内存
Query(sKey: string, defaultValue: any = null)
:访问指定键名的值
Set(sKey: string, value: string | number)
:设置指定键名的值
Save()
:保存内存数据到缓存文件
sendProtocolMsg(msg)
:发送协议到服务端
registerListeners()
:注册网络监听事件,需要在getMessageListeners()
定义需要监听的协议和方法
// AccountModel.ts
getMessageListeners() {
return {
// key:消息名,value:执行函数
['G2C_Login']: (msg) => {
this.G2C_LoginSuccess(msg) },
}
}
# UI模块
UIMng
:UI管理器,用于打开、关闭UI
UIBase
:UI界面基类,在这里可以定义一些通用方法,供子类调用或者继承
UIHelp
:UI工具类,封装一系列UI相关的功能方法
1、新建一个场景或者prefab
2、选中,然后到工具栏:扩展 -> ui-creator
create-node-tree操作
:将prefab节点树的结构自动导出到ts文件(目标文件夹:assets/scrip