Cocos Creator 微信小游戏 填坑记录

本文由本人简书搬迁至此,并做小幅修改。

环境:(ccc-v1.9.1, wx-v1.02.1804251)

  1. 微信小游戏禁止了动态生成并执行代码的功能,window.eval()、 new Function() ,这些都不能用了。

  2. 微信小游戏中window.atob window.btoa 未定义,
    解决:用了这个Base64.js 库。

  3. protobuf.js 6.x 中用到了 new Function(),所以不能用。
    解决:改用了protobuf.js的分支 protobuf.js 5.x

  4. XMLHttpRequest 在微信小游戏中实际上会被替换成,或最终调用wx.request。
    发送消息时, 在都发送 uint8Array 类型的数据的情况下,
    --->在web中,服务端能收到arrayBuffer二进制流。
    --->在微信小游戏中,服务端收到的是一个string, 格式会遵从微信API wx.request的发送规则 (见下图)。

猜测在web中会自动将uint8Array 转为ArrayBuffer然后发送。
而在微信小游戏中,uint8Array 会被认为是一个table。如下:

当header为 ("Content-Type", "application/octet-stream")时,服务器收到的结果:

当header为 ("Content-Type", "application/x-www-form-urlencoded")时,服务器收到的结果:

当header为 ("Content-Type", "application/json")
如果发送的数据格式从uint8Array改成Array,服务器收到的结果:

结论:(1).如果要发二进制,务必务必要在发送前将数据格式转为ArrayBuffer。
(2).微信小游戏文档里的 wx.request 和微信小程序里的 wx.request 其实是一回事,但是微信分开来写了,并且表述的内容不一致(是两个人分别写的吗?坑爹啊),
小游戏里的文档里这个wx.request的参数有dataType,没有 responseType。并且,经过实测 必须制定responseType : "arraybuffer", 才能让返回数据为 ArrayBuffer, 只制定dataType没卵用,这点与文档描述不符。

  1. json文件,在web和模拟器环境加载后会直接变为 object/Array 类型,在小游戏中加载后,是一个 string。原因:我的json文件是在C#中导出的,导出时是带BOM的UTF8编码的文件。 因此json的首字符被添加了一个AscII码为65279的字符。
    临时解决: 在加载完后判断类型,如果为string,则去掉,并且去掉第一个AscII码为65279的字符。最终: 在C#导出时,去掉了BOM。
    另外,使用cc.loader.loadResDir 加载Json文件目录时, 在web下正常, 在微信中会返回一个空的Array。

  2. ccc发布到小游戏中时,不勾选调试模式的话,为节省代码文件大小,所有自定义类型会被混淆和简化,所以不能写 xxx === "某自定义类型名" 这样的判断代码,或其他写死类型名的代码。

  3. 手机中预览黑屏。
    原因:打开手机上调试模式,对应模拟器中的“不校验安全域名”,如果不打开调试模式,微信不允许访问那些没有添加到安全域名的链接。另外,如果已经正确配置了域名,却没有取消勾选“不校验安全域名”, 也是不能的。解决: 在后台配置正确域名,并取消勾选“不校验安全域名”。

  4. ccc提供的AudioSrouce 里的mute 和 pause 等,在小游戏里无效。最后换成了AudioEngine。

  5. ccc的button有问题: 按住A按钮,再按住B按钮,松开A触发点击事件打开界面,遮挡B, 这时送开按B的手指,仍然会触发B按钮的点击事件。

猜你喜欢

转载自blog.csdn.net/NRatel/article/details/83663258