请问在实际运行游戏时显示碰撞区域对象为什么会出现两个CollisionShape2D?

各位好,有个想不明白的问题希望请教一下!

如图所示,我的对象设定了一个CollisionShape2D,为了方便确认,我把选框颜色改成紫色。

为了更好的展现,特意把CollisionShape2D的位置框做出修改

当我在debug时打开显示碰撞区域。

会发现紫色框上面还叠加了一层CollisionShape2D是默认。

这个浅蓝色的框会随着我设置碰撞框的位置自行挪动位置,平时它不会有任何物理碰撞效果。只有打开显示碰撞区域时才出现。

为了方便理解我调整碰撞框位置再示范一次

这时候这个浅蓝色的CollisionShape2D框就会变成这里。

因为它没有物理碰撞效果,所以之前一直无视它的存在。但最近我发现这个框会识别到【嵌入墙壁检测中】,如上图所示,这样代表我的对象已经嵌入墙壁里了…这干扰了我部分动作

我确信对象只设置了一个CollisionShape2D,请问有人知道这个浅蓝色框的出现的原因吗?它代表着什么?如何才能让它消失不见?

你好。

在调试过程中,似乎可以通过选择屏幕顶部的“2D”,然后在目标碰撞体上按住“Alt”+ 右键点击,来显示目标节点。

这或许能提供一些关于此处设置的特定线索。

image

非常感谢帮助,这个方法确实能有效找到这个碰撞框的所在位置。

我把这个偏移的碰撞框标记成黄色。所在位置

/root/CoreScene/GameScenes/GameScene/SceneLayer/P1/CollisionShape2D/@Area2D@13/@CollisionShape2D@12

对象名为P1,这个@Area2D@13/@CollisionShape2D@12,并非我角色的CollisionShape2D,虽然找到了所在位置,但依然不知道要如何关闭禁止它出现。:sweat_smile:

经过漫长的检测,终于到了这个碰撞框的出现的原因。如果对象的VS里有【嵌入墙壁检测中】这个动作时,就会生成这个碰撞框用于识别对象是否嵌入墙壁。

但是这个本应该和我基础CollisionShape2D重叠的碰撞框。只要我的CollisionShape2D并非位置中心(X0.0px Y0.0px)这个用于检测是否嵌入墙壁的碰撞框就会远离我的CollisionShape2D。

举例子A :down_arrow:
如果我的CollisionShape2D位于X0.0px Y0.0px,那这个嵌入墙壁的碰撞框会叠加在我的CollisionShape2D里。

举例子B :down_arrow:

但是如果如果我的CollisionShape2D是X10.0px Y-10.0px,那这个嵌入墙壁的碰撞框会根据我的CollisionShape2D偏离中心的距离 自行再度移动一半距离。

我认为【嵌入墙壁检测中】的碰撞框出现这样的状况是不合理的,这样的碰撞框导致我的角色经常被误判已经被嵌入在墙壁里了。

希望制作组看到此贴可以给与回复如何解决!非常非常感谢!!!

3 个赞

@S.C 的深入调查太棒了,感谢你的详细解析!

据我理解,你的意思是 IsEmbeddedInWallBuriedInWall)条件会自动生成一个 CollisionShape2D,它本应与你主 CollisionShape2D 保持一致,但当主 CollisionShape2D 相对于 (0, 0) 有偏移时,生成的那个却漂移了偏移量的一半,而不是完全匹配。我在自己的环境中也确认了同样的行为,因此我将向开发者报告此问题。再次感谢你的详细报告,这让验证变得非常轻松。

在此之前,一个可能的变通方法是:将主 CollisionShape2D 保持在 (0, 0) 居中,改为偏移 Sprite2DAnimatedSprite2D 来实现你想要的视觉效果。虽然不太理想,但在修复之前应该能避免误检测。

2 个赞

非常感谢gaz的回复和报告,你的理解完全没错。

因为我的角色有不少动作动画,比如蹲下或变形之类的,都使用了AnimationPlayer固定了不同的CollisionShape2D的位置。所以在修复之前我决定暂时关闭IsEmbeddedInWallBuriedInWall)条件。

期待修复的更新!

@Baz 今天我在做**【嵌入墙壁检测中】**测试,有点奇怪。

举例:我把对象A设定触发**【嵌入墙壁检测中】-> 【HP0】 → 【读取存档】**

我发现对象A站在tilemap上,被其他对象移动挤压上或下的都能立马触发嵌入墙壁检测触发成功HP0

但是 左或右的 挤压却无法成功触发嵌入墙壁检测,对象A被会被挤入墙壁里直到移动对象离开。

这是BUG吗?有劳您帮忙复现一下如果是有问题的话一起报告。非常感谢。

让您久等了,本次判定延迟问题已在今天发布的 1.2.9 版本中修复。

非常感谢修复如此即时。

但这个碰撞判定之前还检测出另外一个问题没有修复,麻烦制作组看看↓

1 个赞

我尝试通过以下方法复现该问题:

  1. 创建一个 Area2DGameObject,当检测到卡在墙内时,在控制台中输出“卡住了”。
  2. 向左右或上下移动,使物体嵌入墙体。
    结果显示,无论是左右还是上下移动,该功能均能正常工作。因此,我推测可能存在其他触发条件。
    请问您能否提供一个可复现该问题的项目?

你好,我的对象是普通的GameObject,设置也很简单。

不过我的对象有设置当左右被攻击时会被弹飞扣血。可以确定是这个动作导致无法触发嵌入墙壁检测。但即时是弹飞也应该在anystate里,按道理一样能触发检测才对

录制_2026_04_28_15_06_13_374

我已将对象更改为普通的 GameObject,并尝试了被敌人推入的状态,结果一切正常。

  1. 处于 Anystate 状态、被推入墙壁并在控制台输出“已嵌入”的玩家
  2. 单纯推动该玩家的敌人

我测试了从右向左、从上向下的推动以及嵌入墙壁的情况,均正常输出了“已嵌入”。

我认为很可能是其他某些设置产生了影响。可疑的可能是碰撞体(Collider)的图层/遮罩(Layer/Mask),或者是击飞动作(Knockback Action)的某些设置。

你能否尝试在更精简的设置下重现该问题?

经过一轮检测,可以确定是因为有左边收到攻击导致嵌入检测未能成功

但无论如何调整优先度,只要有这个动作的存在,就无法触发嵌入墙壁检测,实在搞不懂= =|||

可能是某种复合因素导致的,如果可以的话,能请您发送一下项目吗?

可以的,我把单独简化的GameObject发您邮箱,麻烦告知一下邮箱。

我已经知道问题所在但不知道如何解决还请帮忙查看,我自己也在不断做修复尝试。

追加:我在收到攻击的条件动作上追加上更多限制条件后,终于成功触发嵌入墙壁了!!!:rofl:

1 个赞

太好了!
请使用 pgmmv-support@gotchagotcha.jp。

1 个赞

非常感谢moonling先生即时的反馈,让我能很好的一边学习和成长。

测试多次后成功修复好,这次就不用劳烦您帮忙debug了!

另外关于1.29版本BGM的我有几个小问题,已经在您的更新告示下留言了有空可以看看,再次感谢。