cocos2.3.4 2D粒子未播放完成后未正常移除

Creator 版本: 测试版本 CocosCreator2.2.0 和 CocosCreator2.3.4
目标平台: Web 和 native 平台
问题描述: 2D粒子未播放完成后未正常移除


const {ccclass, property} = cc._decorator;

@ccclass
export default class LogicUI extends cc.Component {
    @property([cc.SpriteFrame])
    spriteFrameArr: cc.SpriteFrame[] = [];
    onLoad() {
        // this.schedule(() => {
        //     for (let i = 0; i < 20; i++) {
        //         let wolrd_pos = this.node.convertToWorldSpaceAR(cc.Vec2.ZERO);
        //         let idx = this.randomFromInt(0, this.spriteFrameArr.length - 1);
        //         this.loadParticle("FEN_1", this.node, this.spriteFrameArr[idx], wolrd_pos);
        //     }
        // }, 3, cc.macro.REPEAT_FOREVER,);

        let wolrd_pos = this.node.convertToWorldSpaceAR(cc.Vec2.ZERO);

        let wPosArr = [];
        let spriteFrame = [];
        for (let i = 0; i < 20; i++) {
           
            let idx = this.randomFromInt(0, this.spriteFrameArr.length - 1);
            spriteFrame.push(this.spriteFrameArr[idx]);
            wPosArr.push(wolrd_pos);
        }
        this.loadParticle2("FEN_1", this.node, spriteFrame, wPosArr);
       
    }

    randomFromInt(lowerValue: number, upperValue: number) {
        return Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue);
    }


    loadParticle(url: string, parent: cc.Node, frame: cc.SpriteFrame, wPos: cc.Vec2) {
        cc.loader.loadRes(url, cc.ParticleAsset, (err, particle) => {
            if (err) {
                cc.log(err.toString());
                return;
            }
            let particleNode = new cc.Node("par");
            let particleCom = particleNode.addComponent(cc.ParticleSystem);
            particleNode.position = parent.convertToNodeSpaceAR(wPos);
            particleCom.file = particle;
            particleCom.scheduleOnce(() => {
                particleCom.custom = true;
                particleCom.autoRemoveOnFinish = true;
                frame && (particleCom.spriteFrame = frame);
                particleCom.positionType = cc.ParticleSystem.PositionType.FREE;
                particleCom.resetSystem();
                parent.addChild(particleNode);
            }, 0);
        });
    }


    loadParticle2(url: string, parent: cc.Node, frame: cc.SpriteFrame[], wPosArr: cc.Vec2[]) {
        cc.loader.loadRes(url, cc.ParticleAsset, (err, particle) => {
            if (err) {
                cc.log(err.toString());
                return;
            }

            for (let i = 0; i < wPosArr.length; i++) {
                let particleNode = new cc.Node("par");
                let particleCom = particleNode.addComponent(cc.ParticleSystem);
                particleNode.position = parent.convertToNodeSpaceAR(wPosArr[i]);
                particleCom.file = particle;
                particleCom.scheduleOnce(() => {
                    particleCom.custom = true;
                    particleCom.autoRemoveOnFinish = true;
                    frame && (particleCom.spriteFrame = frame[i]);
                    particleCom.positionType = cc.ParticleSystem.PositionType.FREE;
                    particleCom.resetSystem();
                    parent.addChild(particleNode);
                }, 0);
            }
           
        });
    }
 
}

附工程源码:

CocosDemo2.zip (841.1 KB)

将 particleCom.custom = true; 改成 particleCom.custom = false;
你粒子文件使用的也是默认的配置,并没有勾选自定义。

粒子文件怎么弄成自定义

particle.custom = true;

particle.custom = true; 如果这样写,就会出现上面那个问题。

设置粒子的custom属性,是没法继承粒子文件的配置的,需要手动配置所有参数,可以在编辑器中先制作自定义粒子的节点或者预制体。