hello扫雷 2024-06-19 22:47 采纳率: 66.7%
浏览 7
已结题

Cocos预制体销毁


this.schedule(()=>{
            const bul = instantiate(this.bullet)
            const bul1 = instantiate(this.bullet)


            this.Canvas.addChild(bul)
            this.Canvas.addChild(bul1)
            const x = this.me1.position.x
            const y = this.me1.position.y

            bul.setPosition(x-10,y+60)
            bul1.setPosition(x+10,y+60)

            const comp = bul.getComponent(Collider2D)
            comp.on(Contact2DType.BEGIN_CONTACT,(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null)=>{
                setTimeout(()=>{
                        selfCollider.node.destroy();            
                    }, 500)


            },this);          

            const comp1 = bul1.getComponent(Collider2D)
            comp.on(Contact2DType.BEGIN_CONTACT,(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null)=>{
                setTimeout(()=>{
                        selfCollider.node.destroy();            
                    }, 500)


            },this); 
        },0.25)

CocosCreator3.8.2,想要实现实例化同一种预制体,在不同位置生成,与某物体碰撞后消失。但是这段代码不能实现该效果

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-19 22:47
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的代码来看,主要的问题在于comp.on方法中为bul1Collider2D组件添加碰撞事件监听器时,却错误地再次使用了comp(即bulCollider2D组件)而非comp1(即bul1Collider2D组件)。这将导致bul1实际上没有正确注册碰撞监听器,从而无法在碰撞后执行销毁逻辑。

    以下是修正后的代码段,确保每个实例化的预制体都有正确的碰撞监听器绑定:

    this.schedule(() => {
        const bul = instantiate(this.bullet);
        const bul1 = instantiate(this.bullet);
    
        this.Canvas.addChild(bul);
        this.Canvas.addChild(bul1);
        const x = this.me1.position.x;
        const y = this.me1.position.y;
    
        bul.setPosition(x - 10, y + 60);
        bul1.setPosition(x + 10, y + 60);
    
        const comp = bul.getComponent(Collider2D);
        comp.on(Contact2DType.BEGIN_CONTACT, (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) => {
            setTimeout(() => {
                selfCollider.node.destroy();
            }, 500);
        }, this);
    
        const comp1 = bul1.getComponent(Collider2D);
        // 确保这里使用comp1
        comp1.on(Contact2DType.BEGIN_CONTACT, (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) => {
            setTimeout(() => {
                selfCollider.node.destroy();
            }, 500);
        }, this);
    }, 0.25);
    

    另外,需要注意的是,使用setTimeout来延迟执行销毁可能会引入一些不确定的行为,特别是在游戏性能波动的情况下。如果游戏引擎本身提供了更精确的延迟机制,建议优先考虑使用那些机制来代替setTimeout

    对于Cocos Creator,可以考虑使用node.runAction(cc.sequence(cc.delayTime(0.5), cc.callFunc(() => { node.destroy(); })))来实现延迟销毁,这样可以更紧密地集成到游戏引擎的时间线中,提供更稳定的延迟效果。但考虑到你当前的需求,上述修正应该已经足够解决当前问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月20日
  • 创建了问题 6月19日