所有内嵌图片的粒子效果在显示后再调用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 或步骤吗?
有用 plist 文件带贴图的试过吗?
这边在 web 上测试发现是使用的 plist 不带贴图会出现这个问题;
安卓测试都正常;
这个帖子说的就是plist内嵌图片啊。难道我描述得还不够清楚吗?
今天2.4.5直接升级2.4.9发现粒子出现这个问题,粒子回收后第二次就加载不出来了,解决方案亲测可行,需要每次监听到_initTextureWithDictionary就清理掉particleImagePath
mark一下~~~
