CharacterBody2D和StaticBody2D的碰撞未触发



当CharacterBody2D与StaticBody2D碰撞时,我试图触发打印。我对戈多很陌生,请原谅我

我有3个场景game_levelCharacterBody2D (player)StaticBody2D (item)。在game_level中,我实例化了child Player和Item

我当前将此脚本附加到StaticBody2D (item):

extends StaticBody2D
func _ready():
print("ready")

func _on_StaticBody2D_body_entered(body):
print("Static body collided with: ", body.name)

我试过改变碰撞层&CharacterBody2D和StaticBody2D的掩码如下:

只是撞了一下,但没有打印

CharacterBody2D            || StaticBody2D
Collision>Layer = 1        || Collision>Layer = 1
Collision>Mask = 1         || Collision>Mask = 1

刚刚通过但没有打印

CharacterBody2D            || StaticBody2D
Collision>Layer = 1        || Collision>Layer = 2
Collision>Mask = 1         || Collision>Mask = 2

只是撞了一下,但没有打印

CharacterBody2D            || StaticBody2D
Collision>Layer = 1        || Collision>Layer = 2
Collision>Mask = 1 & 2     || Collision>Mask = 1 & 2

Godot版本:Godot_v4.0.1-stable_win64

在Godot中,Node具有信号,您可以从编辑器或代码连接这些信号。你需要连接信号使它们工作。

我知道你没有接StaticBody2Dbody_entered信号。

使用与Godot将生成的名称匹配的方法(在本例中为_on_StaticBody2D_body_entered)不起作用。

您可以看到Godot是否识别出方法连接了信号,因为它在代码编辑器中的方法声明左侧显示了一个绿色图标。

请参考使用信号


我知道你没有连接StaticBody2Dbody_entered信号…因为StaticBody2D没有body_entered信号。

可以解决这个问题。我已经在其他地方概述了一些方法。这里我就不重复了。

话虽如此,我的建议是不要使用StaticBody2D,而是使用Area2D

如果你需要它是一个StaticBody2D,那么我建议添加一个子Area2DStaticBody2D,并使用它来检测碰撞(这是我在其他地方提到的选项之一)。


为了完整起见,我还将提到您可以检测CharacterBody2D遇到的情况。这样的:

for index in get_slide_collision_count():
var collision := get_slide_collision(index)
prints(collision.get_collider())

对于不移动的CharacterBody2DStaticBody2D来说,这应该是足够的,因为如果StaticBody2D不移动,它就不会撞上CharacterBody2D(换句话说,碰撞将是CharacterBody2D运动的结果)。

※:Godot 4中移动平台的推荐方法是使用AnimatableBody2D,即StaticBody2D

最新更新