直播间内 使用webview加载cocos creator 使用了spine动画 动画透明会合并图层 透明区域会展示原生图层的内容

v3.8 原生加载webview webview加载cocos creator游戏 游戏有个背景图层不透明 然后在这个背景上添加了一个spine动画 但是在播放动画的时候 动画的透明区域会把游戏背景图层也变透明 会直接看到原生图层的东西 image 这是什么原理 怎么解决?

1赞

设置index.html不透明就好了

mark!!!

不透明不行 我们这个游戏是嵌入直播间里的 上半部分是直播内容 下半部分是游戏内容 所以需要设置游戏的背景透明

那你想透明还是不透明

我可能描述的不清楚 这个加载游戏的webview是透明的 游戏最下面的图层是半屏的高度 它上面加了一张背景图片是不透明的,在这张背景图片上 我添加了一个spine动画 这个spine动画 在播放的时候 会有些透明的部分 按照常理来说 及时spine动画透明 也不影响最下面的背景图片 但实际上动画播放的时候透明部分会把背景图片的某些部分也变成透明的了 从而能看到最下面原生的某些内容 仔细看我的图片的话 红框就是播放的动画 可以看到最底层的原生的部分 新星区可以透过去 旁边的进击区 就没有

一个spine动画和一个不相干的背景会透明确实是比较神奇,我建议你找一份别的spine动画来看看,如果没问题我建议你跟美术反馈一下,前提是你确定在你的代码和项目里spin动画和背景确实没关系,否则尝试在spine播放动画的时候甚至页面为不透明,完了设置回去,

实际上 这种小游戏 我已经开发几个了 涉及到spin动画都有这种问题 我原来是做iOS开发的 也是今年半路出家开始做cocos的 不清楚是不是spine动画在播放的时候是不是把所有的图层都混合在一起 然后合并成一个图层渲染出来

互相不影响才对,你这种问题极少

各渲染各的

我的理解也应该是各不影响猜对
image
上图是我做的另一个游戏 同样的问题 可以看到原生页面的文字

给spine挂个材质然后修改一下材质里的混合模式试试看

改成dst_alpha

请问需要怎么挂载 我在文档上没有找到


是在这里选择一下吗 但是我点进材质 显示的内容和你的不太一样

你自己拷贝一个官方默认的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自己参考下修改就行了

可以,很厉害

当初被这个问题坑过哈哈