cocos creator 3.8.0 远程加载spine bug

反馈时请提供以下信息:

  • Creator 版本:3.8.0

  • 目标平台:谷歌浏览器

  • 重现方式:通过远程加载替换spine 的skeletonData,第一次加载没有问题,第二次加载就会变花。

  • 首个报错: 没有报错

  • 编辑器操作系统: windows 10

  • 重现概率:100%-

代码
/** 骨骼动画缓存池 */

private _spCacheList: { [key: string]: sp.SkeletonData } = {};

public loadModel(remoteUrl: string, targetSp: sp.Skeleton, defaultAni: string = null, nodeScale: number = null) {

    if (!remoteUrl) {

        return;

    }

    if (this._spCacheList[remoteUrl]) {

        if (targetSp) {

            targetSp.skeletonData = this._spCacheList[remoteUrl];

            targetSp.premultipliedAlpha = false;//解决白边问题

            if (nodeScale && targetSp.node) {

                targetSp.node.setScale(nodeScale, nodeScale);

            }

            if (defaultAni) {

                targetSp.setAnimation(0, defaultAni, true);

            }

        }

        return;

    }

    let imgName: string = remoteUrl.split("/")[remoteUrl.split("/").length - 1];

    let imageUrl: string = remoteUrl + "/" + imgName + ".png";

    let skeUrl: string = remoteUrl + "/" + imgName + ".json";

    let atlasUrl: string = remoteUrl + "/" + imgName + ".atlas";

    assetManager.loadAny([{ url: atlasUrl, ext: '.txt' }, { url: skeUrl, ext: '.txt' }], (error, assets) => {

        if (error) {

            console.log("加载远程骨骼动画失败,atlasUrl:" + atlasUrl + "  skeUrl:" + skeUrl);

            return;

        }

        assetManager.loadRemote(imageUrl, (error, imageAsset: ImageAsset) => {

            if (error) {

                console.log("加载远程骨骼动画图片失败,imageUrl:" + imageUrl);

                return;

            }

            let asset = new sp.SkeletonData();

            asset.skeletonJson = assets[1];

            asset.atlasText = assets[0];

            let texture = new Texture2D();

            texture.image = imageAsset;

            asset.textures = [texture];

            asset.textureNames = [imgName + '.png'];

            this._spCacheList[remoteUrl] = asset;

            if (targetSp) {

                targetSp.skeletonData = asset;

                targetSp.premultipliedAlpha = false;//解决白边问题

                if (nodeScale && targetSp.node) {

                    targetSp.node.setScale(nodeScale, nodeScale);

                }

                if (defaultAni) {

                    targetSp.setAnimation(0, defaultAni, true);

                }

            }

        });

    });

}

自己顶自己顶,官方有人看到吗?

有没有大佬帮忙分析一下。

assetManager.loadAny([{ url: atlasUrl, ext: ‘.atlas’ }, { url: skeUrl, ext: ‘.json’ }] 修改成加载对应的格式就可以了。

感谢,我也遇到了这个问题

第二次调用你封装的 loadModel 就出问题吗?
方便给个复现demo吗?我来跟进下。

第二次调用 loadModel 会直接走缓存返回了。没发复现你说的变花问题啊。

url 已经有后缀了,并不需要再传递 ext,传错了反而有问题。