Cocos Creator 命令行构建

Cocos Creator 是一个完整的游戏开发解决方案, 包括了 cocos2d-x 引擎的 JavaScript 实现, 以及能让你更快速开发游戏所需要的各种图形界面工具。 Cocos Creator 完全为引擎定制打造, 包含从设计、开发、预览、调试到发布的整个工作流所需的全功能一体化编辑器。 Cocos Creator 目前支持发布游戏到 Web、iOS、Android、各类”小游戏”、PC 客户端等平台, 真正实现一次开发, 全平台运行。

以上内容选自官方文档。 总结出来就是以下几点:

  • Cocos Creator 是 cocos2d-js 引擎的图形化工具, 可以更方便、 更高效的开发游戏
  • Cocos Creator 制作的游戏可以发布到几乎任何平台

通过 Cocos Creator 开发游戏确实非常高效, 各种工具一应俱全, 游戏的性能也是非常出色。 但是游戏的构建存在一些不便, 尽管官方提供了命令行发布的功能, 但总是觉得缺了什么。

场景

试想以下场景, 当你通过 Cocos Creator 开发了几十甚至上百个游戏, 有些游戏使用了相同的 build-template 甚至连游戏加载的界面都需要相同。 这时候官方的命令行发布就不够用了, 虽然你可以通过复制(不管是手动还是通过 shell 批量复制)来达到这一目的, 但就是感觉有那么一点不灵活; 再加上如果这些游戏放在同一个服务下, 静态资源服务的路径查找也是问题, 所以需要定制一套构建工具来完成对这些功能的扩展。

上述场景提及的问题, 其实是前端开发中比较常见的问题, 只是 Cocos Creator 本身并不是特别前端化的工具, 它首先是游戏开发工具, 只不过是现在跑在了浏览器环境而已。 但是既然遇到了问题, 就需要解决问题, 我们完全可以把前端的工程化概念引入, 使它更”现代化”一点。

配置化

想要灵活性, 就不可避免的会提升一点复杂度, 把各种选项配置化就可以达到这个目的。 那么现在问题就变成了需要提供哪些配置项呢? 针对上述场景, 容易想到的有以下几点:

  • 编译哪(几)个游戏
  • 它们使用的模板
  • 编译到哪个平台
  • 编译后输出到哪个路径
  • 静态资源服务路径

在明确这些配置项之后, 接下来的工作不过是一些文件操作, 最后通过官方的命令行发布工具就可以完成最终的构建工作。

编译到 Vue

在完成上述功能后, 我不禁想能不能将 Cocos Creator 和前端开发的其他库如 Vue 结合起来。 因为想要通过前端库(如 pixijs 等)实现比较炫酷的游戏效果成本还是比较高, 而单纯通过 Cocos Creator 来实现又无法保证较好的代码复用性。

仔细观察一下 Cocos Creator 发布后的 .html 文件会发现, 引用了两个 .js 文件(main.js 和 setting.js, cocos 的运行时自然不必多说), 试着直接复制这两个 .js 文件的内容到测试用的 .vue 文件中试试, 发现可以运行, 既然如此我们就可以把 Cocos Creator 编译到 Vue 的 SFC 文件(单文件组件)。

AST

现在要做的很简单, 无非就是把 main.js 和 setting.js 的内容直接读取到预先定义好的 .vue 模板中。 我的做法是定义一个 __cc__require__() 方法, 参数是想要引用的文件, 该方法会将文件的内容读取到 .vue 模板中, 最终生成一个新的 .vue 文件。

通过 babylon 及其相关工具库(babel-generator, babel-traverse)就可以很简单的到达这一目的, 将 __cc__require__(filename) 替换为最终的文件内容并生成文件即可。

Vue 和 Cocos Creator 混合开发

既然可以把 Cocos Creator 的构建结果编译到 Vue, 那就少不了将两者混合起来进行开发。 由于 Cocos Creator 已经将开发时的编译直接放到了应用中, 我们没办法获取具体细节, 而且这么做也太麻烦, 我就采用了其他方式。

  • 同时启动 Vue 的编译, 以及 Cocos Creator 的开发, 将 Vue 的编译结果输出到 Cocos Creator 的 scripts 路径下, 将 Vue 的编译结果作为 Cocos Creator 的脚本。 当然在最终执行 Cocos Creator 的构建时, Vue 的编译结果要先删除。
  • 编写一个 history2Hash() 方法将 VueRouter 的 history 模式替换为 hash 模式, 否则 Cocos Creator 的服务无法伺服当前的 URL。
  • 测试环境或者 pre 环境的后端服务开启 CORS 避免跨域问题, 保证可以正常调试接口。
  • 如果你的前端脚手架是多页面的, 那就在编译时指定将哪个 entry 文件编译到 Cocos Creator 的哪个游戏下(如果你有多个 Cocos Creator 游戏)。

注: 最终构建 Cocos Creator 时, 别忘了把 Vue 编译的文件先删除。

cc-builder

最后, Cocos Creator 的命令行构建工具已经实现并发布到 npm, 通过 npm install cc-builder -g 即可使用。 具体代码和文档可见 github