注:我写这篇文章的时候用的CocosCreator版本2.0.10
一、子域被拉伸
子域被拉伸的根本原因就是挂载WXSubContextView组件的节点的宽高比和子域场景的宽高比不一致
1.宽高比保持一致
官方文档有提到这点
挂载WXSubContextView组件的节点的宽高比要和子域界面的宽高比一致,子域界面不要勾选Fit Width和Fit Height
2.进行视窗更新
有时候我们要手动设置挂载WXSubContextView组件的节点的大小,这时候就需要
使用updateSubContextViewport(),如果不起作用,试试reset()
进行视窗更新一定要在发消息给子域之前
二、子域不显示
1.查看子域有没有收到主域发的消息
2.如果没收到消息
自己查找原因
3.如果收到消息
1)查看收到的消息是否正确
此条是针对子域需要根据接收的消息的不同而进行不同操作的情况
例如:根据消息的message参数进入不同的子域场景
2)查看子域的代码是否全部执行
此条是针对主域有禁用WXSubContextView的操作的情况
我遇到的情况是:
this.wxSubContextView.getComponent(cc.WXSubContextView).enabled = false;
wx.postMessage({
message: "mapRank",
})
setTimeout(function () {
that.wxSubContextView.getComponent(cc.WXSubContextView).update();
}, 100);
在发消息给子域的前后,如果我们禁用组件,那么子域的代码有可能只会执行一半就不会再执行了,然后就造成子域不显示的问题
要确保子域代码执行完毕之后再禁用WXSubContextView组件
4.查看位置和层级是否正确
有时候可能子域确实显示出来了,可能是位置不对,不在屏幕的范围内;或者被其他节点完全遮住了,导致我们并没有看见子域画面
三、挂载WXSubContextView组件的节点无法设置位置
我的情况是直接用setPosition()设置挂载WXSubContextView组件的节点的位置并没有什么用,不知道是为什么,具体的情况我也没仔细研究,这里只说一下我的解决方法:
我直接设置挂载WXSubContextView组件的节点的父节点的位置,这样就能让这个节点位置改变了
四、包体过大
这一问题,是我在微信开发工具想要真机调试/预览的时候遇到的问题。
因为我一开始做的时候并没有注意微信对包体的大小有限制
解决方法,分包加载、引擎模块裁剪,资源部署到服务器
五、子域接收到多条消息
这一问题,是我在子域接收消息的把最后一个else写上的时候发现的
wx.onMessage(data => {
if (data.message == "main") {
console.log('收到的数据', data);
if (data.openid) {
global.openid = data.openid;
}
}
else if (data.message == "mapRank") {
console.log('收到消息','mapRank');
cc.director.loadScene('mapRank');
}
else if (data.message == "levelRank") {
console.log('收到消息','levelRank');
cc.director.loadScene('levelRank');
}
else{
console.error("message参数不正确!");
}
})
我加上最后一个else之后,发现每次都会打印多条“message参数不正确!”的报错语句。
更惊奇的是,当把发消息的语句注释掉的时候,子域任然能接收到消息,输出报错语句。
我也不知道什么原因,在浏览Cocos论坛时发现有人遇到同样的问题,但官方没有给出答复