华为联机对战 SDK 适配微信开发环境
问题现象
使用 Cocos Creator 集成华为联机对战JS SDK后,导入到微信开发工具后报错如下:
VM28 WAGameSubContext.js:2 Unhandled promise rejection TypeError: Cannot read property 'Client' of undefined
at e.<anonymous> (index.js:1467)
at l (index.js:1426)
at Object.next (index.js:1370)
at index.js:1343
at new $ (VM28 WAGameSubContext.js:2)
at c (index.js:1319)
at e.initSDK (index.js:1464)
at e.start (index.js:1460)
at cocos2d-js-min.js:1
at r._invoke (cocos2d-js-min.js:1)(env: Windows,mg,1.05.2110110; lib: 2.24.1)
问题分析
华为联机对战 SDK 默认导出 CommonJS 模块,而在 cocos2.X 版本中使用的是插件脚本的方式导入 SDK,GOBE 被挂载在 window 下使用,当编译成微信小游戏后,微信环境下缺少 cocos 中将 GOBE 挂载到 window 的动作导致运行时找不到 GOBE 报错。
解决方案
方案一:Cocos Creator 2.x 推荐使用插件脚本的方式引入SDK
1. 将联机对战 SDK 导入 Cocos 资源管理器后,在 属性检查器 中勾选设置 导入为插件。
2. 在 Cocos 中选择项目/构建发布,选择发布平台为微信小游戏,构建成功后将在./build目录下生成微信小游戏工程。
3. 在构建好的微信小游戏工程目录下的game.js文件中添加window.GOBE = require('./src/assets/GOBE/GOBE'); 手动挂载联机对战SDK,require中的路径为GOBE.js文件的对应路径。
方案二:Cocos Creator 3.x 推荐使用外部模块方式引入SDK
1. 首先向Cocos工程下的 tsconfig.json 增加允许对包含默认导出的模块使用默认导入字段
"compilerOptions": {
"allowSyntheticDefaultImports": true,
}
2. 在Cocos中使用ES模块的导入方式引入联机对战SDK。
3. 使用 Cocos 构建成微信小游戏工程后可直接运行。
参考文档: