cocos3.x onTriggerEnter 只在首次触发,后续只触发 onTriggerStay

  • Creator 版本:3.6.1

  • 目标平台: 模拟器

  • 重现方式:
    enableAttack(bAttacking: boolean) {
    if (bAttacking) {

              this.weaponCollider.on("onTriggerEnter", this.onTriggerEnter, this);
    
              this.weaponCollider.on("onTriggerStay", this.onTriggerStay, this);
    
              this.weaponCollider.on("onTriggerExit", this.onTriggerExit, this);
    
          } else {
    
              this.weaponCollider.off("onTriggerEnter", this.onTriggerEnter, this);
    
              this.weaponCollider.off("onTriggerStay", this.onTriggerStay, this);
    
              this.weaponCollider.off("onTriggerExit", this.onTriggerExit, this);
          }
    
          this.bAttacking = bAttacking;
      }
    

使用情景:
将 collider 当成武器挂接在 player 上,player 播放攻击动画控制 bAttacking 也就是开关武器的碰撞。

通过上面的代码动态开关同一个 collider 的碰撞检测:发现第一次能正常触发 onTriggerEnter,后续碰撞只会触发 onTriggerStay。直到 player 更改位置才能正确触发。

两个collider没onTriggerExit,就一直是onTriggerStay吧,一直碰着呢

请问 怎样才能清理掉上次的碰撞状态,做到动态开关复用呢

绝了,发现即使改成每次碰撞之前重新创建 collider,结束后 destroy 都不行,一定要 owner node 的位置有变更才可以。

加一行刷新 owner 节点的位置信息 this.owner.node.setPosition(this.owner.node.getPosition()); ,可以了…

enableAttack(bAttacking: boolean) {

    console.log("enableAttack: ", bAttacking);

    if (bAttacking) {

        this._attackedActors.clear();

        this.addCollider();

        this.owner.node.setPosition(this.owner.node.getPosition());

    } else {

        this.removeCollider();

    }

    this.bAttacking = bAttacking;

}