Defold适配微信小游戏初步

序章

这又是一篇挖坑待填的文章,有新进展随时更新~
纯当抛砖引玉,所任何意见、建议、疑问,欢迎评论区留言

最近游戏引擎界也是搞事不断,先有Unity引擎想搞运行费政策,后有开源Godot引擎搞lgbt运动,哈哈哈,都说下一个不会轮到Unreal吧,只希望开源引擎别把自己技术社区搞死了。
正好国庆也有时间,博主作为爱好者也在引擎间反复横跳一下,试试看Defold引擎体验如何,是否方便适配小游戏环境。

Defold引擎介绍

最早了解到Defold是翻看Android Game Development Kit(AGDK,android游戏开发的支持库)文档看到Android的5大推荐引擎 Defold/Godot/Cocos/Unity/Unreal

直接引用文档里评价Defold原话

Defold 是一个使用 Lua 编程语言作为其脚本语言的开源引擎。Defold 为 2D 游戏和图形提供广泛支持,并内置对粒子、精灵、图块地图和 Spine 模型的支持。虽然 Defold 专注于 2D,但它使用 3D 渲染引擎,支持渲染 3D 模型和网格,以及自定义材质和着色器。它内置物理支持,并提供 2D 或 3D 物理特性选项。Defold 基于包含适用于游戏场景和对象的布局和属性工具的可视化编辑器。Defold 编辑器包含集成的脚本修改和调试功能。Defold 引擎通过插件系统支持原生代码。

总得来说,轻量,2D开发能力支持比较完整,3D开发可能也行。
当然使用lua开发这个事,好多人比较抵触,认为lua有静态检查能力弱,性能比较差等等问题。Defold官方为了性能采用lua5.1语法,使用luajit(据说luajit比lua官方虚拟机性能一般能提升10倍),顺便说下感觉Defold官方对lua新版颇有微词,认为lua每次更新不解决关键问题,还老搞出对api兼容性的破坏。当然,浏览器环境不用了luajit,所以Defold在浏览器环境用的lua5.1.4。浏览器用lua5.1性能做小游戏估计应该也还好。

Defold引擎接小游戏环境

按照小游戏官方文档在Cocos2d-x及原生目标引擎适配
章节说法,理论上采用Emscripten转换方案的引擎,大多应该都能比较容易转到小游戏环境上,因为Emscripten转换本身是面向浏览器环境的,小游戏环境和浏览器环境有接口层的差异,所以一般都需要修改JS胶水层的适配。
这里额外说一下关于常见几家引擎适配小游戏环境的进展:

  1. Unity,即Unity3d,闭源引擎。使用Emscripten实现转换到WebGL平台。微信小游戏官方提供给Unity适配小游戏插件,Google官方提供给Unity适配Google AAB包的插件。博主就说一般引擎都是去主动适配平台,哈哈哈,Unity反着来,可谓是家大业大(当然高情商说法是Unity可扩展性好,不必要Unity官方去改引擎适配)。需要一定开发量接小游戏,算是比较方便。
  2. Cocos,特指Cocos Creator(一般缩写叫CCC),博主称之为半步开源,其中JS引擎有源码,但CCC的编辑器是Electron写的不给源码。不同于Cocos2d-x,CCC是纯JS引擎+高性能计算用wasm。目前CCC官方提供小游戏适配,应该最最方便接入小游戏的。至于Cocos2d-x,需要的话可以按上面链接里填问卷联系小游戏官方去要Cocos2d-x的适配。
  3. Godot,开源引擎,使用Emscripten实现转换到WebGL平台。目前能看到小游戏社区和Godot论坛不少问小游戏适配计划的问题,不确定什么时候会开展。
  4. Defold,开源引擎。使用Emscripten实现转换到WebGL平台。
  5. UE,即Unreal Engine,虚幻引擎,开源(比较特殊一点,可以自己改,但不能往里混Copyleft代码破坏引擎的协议政策),其中UE5彻底放弃WebGL了(据说是性能不行),UE4应该还保留了WebGL能力,具体博主没了解过,有兴趣可以自行查查资料。
  6. Babylon.js,看名字就知道,JS游戏引擎,开源,微软法国团队做的。小游戏社区有人做了Babylon.js和three.js的架手架适配小游戏环境。不过Babylon.js有个小缺点,官方没提供编辑器(或者说查看器,毕竟开发游戏总要编辑和查看游戏场景里物体吧),由Babylon社区提供的第三方支持。

小游戏官方在上面文档里给了一个weapp-adapter,是用来抹平小游戏和浏览器差异的,解压出来是下面这样,weapp-adapter.js是我们最终需要的文件,src目录是源码,用来自己修改的,改完可以用重新build生成weapp-adapter.js。如果不需要自己修改,可以直接用小游戏开发者工具导入一个官方提供的gl打飞机样例,那里边的weapp-adapter.js和这份基本一样。
weapp-adapter
然后是Defold,这里用Defold官方的War battles tutorial教学游戏做例子,按照教学完成后,直接菜单里导出H5 App
在这里插入图片描述
导出来目录结构如下图,核心就是dmloader.js先启动,然后根据当前环境动态加载,如果导出时选的是wasm,就加载*_wasm.js和*.wasm,否则就加载asm.js。当前导出的结构是可以直接在浏览器里运行的,所以可以自己先跑跑看,在浏览器里断点看看加载流程,注意这个需要启用http服务方式运行,不能直接双击html打开的方式运行
在这里插入图片描述
然后我们开始准备小游戏环境,我们用微信开发者工具新建一个小游戏样例工程,留下project.config.json,然后把刚才提到的weapp-adapter.js和Defold导出的目录丢进去,变成下面这样。html文件就不需要了,因为小游戏环境使用自己单独的html。
在这里插入图片描述
然后准备在game.js里导入需要的代码,开始遇坑填坑~
首先先引入weapp-adapter层,糊一层胶水,wx.setEnableDebug是用来设置小游戏为debug状态,显示vconsole的,真机上需要,开发者工具里可以先不加。
在这里插入图片描述
之后,引入dmloader.js,load游戏
在这里插入图片描述
此时,可以运行试试,是有报错的,因为Defold在加载时是用了一套动态加载方案,允许加载asm.js或者wasm二选一,需要动态加载js文件添加到html里,但是小游戏环境博主测试是没法动态添加js,也没法改html,所以得换成静态import文件。其次,用import方式模块化,所有的变量都不会提升到顶层的window层,也就是var Module = {},不会创建为window.Module = {},同样的,获取Module的地方,也不会从window.Module获取,这里都需要手工修改。
所以博主改成这样,哈哈哈,完全给*_wasm.js封装了一层最外层函数名为realLoad,当运行到需要动态加载的接口时,再执行加载
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在之后,还会遇到WebAssembly加载的问题,因为小游戏环境需要使用自己的WXWebAssembly接口进行加载,改~
在这里插入图片描述
现在先别急,还得继续改,因为还有不少的canvas和html元素获取不到,所以秉承哪里报错注释哪里的方式,继续把阻碍游戏启动的流程注释掉
判断不出glsupport,改成直接true
在这里插入图片描述
获取不到canvas数据,我们先直接return
在这里插入图片描述

网页元素canvas找不到,获取了app-container不存在,我们直接用proxy拦截掉
在这里插入图片描述
在这里插入图片描述
至此,基本的靠着哪里报错改哪里的精神,游戏终于算能显示出来了,当然能后续还得有不少适配修改的地方,但万事开头难嘛,有了这个基础知识,就可以在此基础上继续探索不断改进了~

简易结果

给个截图例子,下图左面窗口是在小游戏开发者工具里的表现,右面窗口是Defold引擎里自己运行的表现,功能目前都没适配,只能说,啊,画面动起来了~
小游戏截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值