unity转微信小游戏之函数互相调用
本文记录了在Unity与微信小游戏交互过程中遇到的JS调用问题及解决方案。主要包含两部分内容:1) Unity调用微信JS时,需正确封装JS函数对象并通过WASM API调用,同时需将自定义JS文件放入Unity指定目录并修改模板文件;2) 微信端调用Unity函数时,应使用Module.SendMessage方法而非AI建议的错误方式。文章详细说明了文件存放位置、代码修改位置等关键细节,为开发者
关于这个工作,不熟悉js的我踩了不少坑,记录一下,希望能帮到一些同仁
主要是参考这个文档
参考文档
然后有几个自己踩得坑记录一下
Unity调用微信的JS
1.unity CS端:
private void OnClickBtn1()
{
WeChatWASM.WX.CallJSFunction("WXRecommend", "loadRecommend");
}
用WASM的API,参数1是自定义的js文件名,参数2是方法名
2.自定义js文件
const WXRecommend = {
recommendPageManager:null,
loadRecommend: async function () {
if (!wx.createPageManager) {
throw '当前基础库版本暂不支持。';
}
this.recommendPageManager = wx.createPageManager();
await this.recommendPageManager.load({
openlink: 'TWFRCqV5WeM2AkMXhKwJ03MhfPOieJfAsvXKUbWvQFQtLyyA5etMPabBehga950uzfZcH3Vi3QeEh41xRGEVFw', // 推荐组件OPENLINK常量,直接复制即可,无需理解含义
});
Module.SendMessage('ApplicationShell', 'OnVXRecommendWndReady');
this.recommendPageManager.on(
'destroy',
(res) => {
Module.SendMessage('ApplicationShell', 'OnVXRecommendWndDestroy', res.isRecommended?'true':'false');
console.log('recommend component destroy:', res.isRecommended);
},
)
},
/**
* 拉起推荐组件
*/
showRecommend: async function () {
if (!this.recommendPageManager) {
await this.loadRecommend();
}
return await this.recommendPageManager.show();
},
}
GameGlobal["WXRecommend"] = WXRecommend;
console.error('WTF.......:', "dsdkjsdkshiwon,cnxcdhjchdisuh");
因为鄙人不善于写js代码,这地方折腾了好久。
注意要把函数都包装到一个js对象里,我这里是:WXRecommend 用大括号包裹起来,然后再最后在用GameGlobal[“WXRecommend”] = WXRecommend; 这样就相当于全局都能引用这个WXRecommend了,这样C#调用的js名字就能找到他了。
3.把js类放入对应位置
我们转换微信小游戏工程最终是要放在这个位置的
而我不可能每次都在这里加,肯定是在unity里加。
参照文档,写好js之后 放在这个目录下
这样转完了就会生成在对应位置,我这个版本的转换工具原来是没有这个目录的,需要自己创建。
4.要在game.js里加载到自己写的js
自己写的js需要在微信小游戏的主函数game.js里加载到才能使用,否则无效,所以需要在game.js里加上这么一句
require('./WXRecommend.js');
加在头部就行了,同样的,为了避免每次生成game.js之后手动修改,我们需要在unity里修改模版js
这里找到他的模版js在这里(藏得挺深)
把他复制出来一份,然后加上Requre()那句,然后在粘贴在之前同样的位置,大功告成
微信端调用Unity函数
这个花费了我好多时间,之前一直没注意到文档下边有写
// 其中,objectName 是场景中的对象名称;methodName 是当前附加到该对象的脚本中的方法名称;value 可以是字符串、数字,也可为空。
GameGlobal.Module.SendMessage(objectName, methodName, value)
轻信了AI的谗言,找了半天
GameGlobal.manager.gameInstance.SendMessage(XXX)
GameGlobal.unityNamespace.SendMessage(XXX)
都死活调用不出
结果发现胶水层
直接调用这个就行
Module.SendMessage(“gameobject名字”,"函数名字”,"参数可选”);
注意在unity端要确认好对应的物体和函数名即可。
更多推荐



所有评论(0)