Phaser 3中如何销毁两个对象间的重叠检测?
问题解决:Phaser中重叠检测无法销毁的问题
你的代码存在两个核心逻辑错误,导致重叠检测无法正常销毁:
- 每次按下E键且重叠时,你才创建
overlap实例,紧接着立刻调用移除方法——此时重叠回调还未触发,甚至这个overlap还未真正生效就被删除了。 - 将重叠检测的创建和销毁放在
Update循环中,每帧都会重复执行,逻辑完全混乱。
正确实现思路
- 在场景的
create方法中提前创建重叠检测并保存引用,避免重复创建 - 在交互完成后的回调函数内销毁重叠检测,而非创建后立刻删除
- 新增状态变量标记交互是否完成,防止重复触发
修正后的代码示例
// 在场景的create方法中初始化(请勿放在Update内) create() { // ... 其他初始化代码(比如角色、对话框、按键绑定等) this.hasInteracted = false; // 标记交互是否完成 // 提前创建重叠检测,保存引用 this.colliderRozcestnik = this.physics.add.overlap( this.postava, this.rozcestnik, this.diaOknoRozcestnik, this.checkTriggerCondition, // 自定义触发条件 this ); } // 自定义重叠触发条件:仅当未交互且按下E键时触发 checkTriggerCondition(postava, rozcestnik) { return this.keys.E.isDown && !this.hasInteracted; } // 重叠交互回调函数 diaOknoRozcestnik(postava, rozcestnik) { postava.anims.play("left"); this.gzDialog.visible = true; // 修复原代码的赋值遗漏 this.gzDialog.setText("I need to find some car mechanic to repair the engine."); // 标记交互完成,防止重复触发 this.hasInteracted = true; // 销毁重叠检测 this.physics.world.removeCollider(this.colliderRozcestnik); } // 保留你的重叠检测函数(也可直接使用Phaser内置逻辑) checkOverlap(postava, rozcestnik) { var boundsA = postava.getBounds(); var boundsB = rozcestnik.getBounds(); return Phaser.Geom.Intersects.RectangleToRectangle(boundsA, boundsB); }
关键说明
- 把重叠检测的创建移到
create方法,确保只初始化一次 - 通过
checkTriggerCondition精准控制触发时机,避免无效触发 - 在回调内部完成状态标记和重叠检测销毁,此时交互已完成,销毁操作才会生效
- 修复了原代码中
this.gzDialog.visible未赋值的错误,需显式设置为true才能显示对话框
内容的提问来源于stack exchange,提问作者Anyn
相关产品推荐
相关产品推荐

