v3.8 原生加载webview webview加载cocos creator游戏 游戏有个背景图层不透明 然后在这个背景上添加了一个spine动画 但是在播放动画的时候 动画的透明区域会把游戏背景图层也变透明 会直接看到原生图层的东西
这是什么原理 怎么解决?
设置index.html不透明就好了
mark!!!
不透明不行 我们这个游戏是嵌入直播间里的 上半部分是直播内容 下半部分是游戏内容 所以需要设置游戏的背景透明
那你想透明还是不透明
我可能描述的不清楚 这个加载游戏的webview是透明的 游戏最下面的图层是半屏的高度 它上面加了一张背景图片是不透明的,在这张背景图片上 我添加了一个spine动画 这个spine动画 在播放的时候 会有些透明的部分 按照常理来说 及时spine动画透明 也不影响最下面的背景图片 但实际上动画播放的时候透明部分会把背景图片的某些部分也变成透明的了 从而能看到最下面原生的某些内容 仔细看我的图片的话 红框就是播放的动画 可以看到最底层的原生的部分 新星区可以透过去 旁边的进击区 就没有
一个spine动画和一个不相干的背景会透明确实是比较神奇,我建议你找一份别的spine动画来看看,如果没问题我建议你跟美术反馈一下,前提是你确定在你的代码和项目里spin动画和背景确实没关系,否则尝试在spine播放动画的时候甚至页面为不透明,完了设置回去,
实际上 这种小游戏 我已经开发几个了 涉及到spin动画都有这种问题 我原来是做iOS开发的 也是今年半路出家开始做cocos的 不清楚是不是spine动画在播放的时候是不是把所有的图层都混合在一起 然后合并成一个图层渲染出来
互相不影响才对,你这种问题极少
各渲染各的
我的理解也应该是各不影响猜对

上图是我做的另一个游戏 同样的问题 可以看到原生页面的文字
改混合模式有效果吗
其他几个混合因子也改改试试呗
这是混合模式导致的
//修复黑边之类的一切问题
(()=>{
//@ts-ignore
cc.Texture2D.prototype._deserialize = function (data) {
let Texture2D = cc.Texture2D
let fields = data.split(',');
// decode extname
let extIdStr = fields[0];
if (extIdStr) {
//@ts-ignore
var result = Texture2D._parseExt(extIdStr, this._format);
if (result.bestExt) {
this._setRawAsset(result.bestExt);
this._format = result.bestFormat;
}
else if (result.defaultExt) {
this._setRawAsset(result.defaultExt);
//@ts-ignore
cc.warnID(3120, result.defaultExt, result.defaultExt);
}
else {
//@ts-ignore
throw new Error(cc.debug.getError(3121));
}
}
if (fields.length === 8) {
// decode filters
this._minFilter = parseInt(fields[1]);
this._magFilter = parseInt(fields[2]);
// decode wraps
this._wrapS = parseInt(fields[3]);
this._wrapT = parseInt(fields[4]);
// decode premultiply alpha
this._premultiplyAlpha = true;
this._genMipmaps = fields[6].charCodeAt(0) === 49;
this._packable = fields[7].charCodeAt(0) === 49;
}
}
//制更改cocos的混合模式
//@ts-ignore
cc.Sprite.prototype._updateMaterial = function () {
let texture = this._spriteFrame && this._spriteFrame.getTexture();
if(texture){
texture.setPremultiplyAlpha(true)
}
// make sure material is belong to self.
let material = this.getMaterial(0);
if (material) {
if (material.getDefine('USE_TEXTURE') !== undefined) {
material.define('USE_TEXTURE', true);
}
material.setProperty('texture', texture);
}else{
return
}
material.setBlend(
true,
//@ts-ignore
cc.gfx.BLEND_FUNC_ADD,
cc.macro.ONE, this._dstBlendFactor,
//@ts-ignore
cc.gfx.BLEND_FUNC_ADD,
cc.macro.ONE, this._dstBlendFactor
);
}
})()
随便复制到一个脚本 即可解决 仅限2.x 3.x自己参考下修改就行了
可以,很厉害
当初被这个问题坑过哈哈



