2.4.6粒子效果严重bug

所有内嵌图片的粒子效果在显示后再调用cc.game.restart(),会导致所有粒子图片已被销毁但cc.assetManager.assets中仍然持有引用的情况,所以restart后显示粒子的时候会报错。

同样的问题,不过可能很多人都不实用restart

热更完不都得使用restart吗

看到有人也遇到了同样的问题,我把我的解决方案贴出来,随便放在某个脚本的最外层保证先执行就行了

//粒子内嵌图片在重启时自动销毁
let particleImagePath: string[] = [];
let _initTextureWithDictionary: Function = cc.ParticleSystem.prototype['_initTextureWithDictionary'];
cc.ParticleSystem.prototype['_initTextureWithDictionary'] = function(this: cc.ParticleSystem, dict) {
    _initTextureWithDictionary.call(this, dict);
    if (!dict["textureFileName"] && dict["textureImageData"]) {
        let imgPath = cc.path.changeBasename(this['_plistFile'], '');
        if (particleImagePath.lastIndexOf(imgPath) < 0)
            particleImagePath.push(imgPath);
    }
}
cc.game.on(cc.game.EVENT_RESTART, function() {
    for (const path of particleImagePath)
        cc.assetManager.assets.remove(path);
    particleImagePath.length = 0;
});
3赞

热更新界面 就不要用粒子的 不就行了?

今天提交bug没

是需要热更新才会出现这个情况吗?
简单的 helloworld 没复现。
方便提供简单的复现 demo 或步骤吗?

超容易复现,不需要热更新。2.4.6版本,内嵌图片的粒子资源NewProject.zip (836.5 KB)

有用 plist 文件带贴图的试过吗?
这边在 web 上测试发现是使用的 plist 不带贴图会出现这个问题;
安卓测试都正常;

这个帖子说的就是plist内嵌图片啊。难道我描述得还不够清楚吗?

今天2.4.5直接升级2.4.9发现粒子出现这个问题,粒子回收后第二次就加载不出来了,解决方案亲测可行,需要每次监听到_initTextureWithDictionary就清理掉particleImagePath

mark一下~~~


这边加个防护也行。
路径:.\2.4.9\resources\engine\cocos2d\particle\CCParticleSystem.js