Godot on_body_entered 不会触发

问题描述 投票:0回答:1

您好,感谢您的宝贵时间:) 我尝试制作一把简单的剑来攻击并击中蘑菇,击中蘑菇时应该播放动画。由于某种原因,它永远不会与我的剑互动,就好像它在不同的层上一样。

场景层次结构是一个玩家场景,我在其中添加了 Node2D(名为武器),以及一个动画 Sprite2d 和一个区域 2d(名为 hitbox)。 在此输入图片描述

该武器的脚本如下所示

extends Node2D

@onready var animated_sprite = $AnimatedSprite2D
@onready var collision_shape = $Hitbox/CollisionShape2D

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _physics_process(delta):
    if Input.is_action_just_pressed("attack"):
        collision_shape.disabled = false
        print(collision_shape.disabled)
        animated_sprite.play("sword_attack")
    else:
        collision_shape.disabled = true
        print(collision_shape.disabled)


func _on_hitbox_body_entered(body):
    print("on body entered")
    if body.is_in_group("hit"):
        body.on_hit()

蘑菇脚本看起来像这样

extends Node2D

@onready var animated_sprite = $AnimatedSprite2D

func on_hit():
    animated_sprite.play("slash_mushroom")
    #queue_free() when animation is over.

剑和蘑菇的图层和蒙版都设置为 3。 蘑菇将组变量“hit”附加到其 Node2D。

“_on_hitbox_body_entered”下的剑打印线永远不会打印,所以我知道这就是问题所在,但我不知道为什么它不会交互,非常感谢任何帮助:)

我尝试过... 查看目标(蘑菇)节点 --> 组,该节点附加到其 node2d 并以小写形式命名为“hit”。

检查图层和蒙版,但都设置为3

检查 on_body_entered 是否从area2d(ergo hitbox)正确附加,双击它会将我带到剑的hitbox功能,如上所示。

通过在上面的 if 语句中显示打印内容,确保启用剑碰撞,这似乎有效。

编辑---------------------- 我已经取得了一些进展,显然 on_body_entered 不会在蘑菇上触发,但 on_area_entered 会触发。 然而,它仍然不会触发我的打印和使用,来自蘑菇脚本的area.on_hit():

   func _on_hitbox_area_entered(area):
    print("on area entered")
    if area.is_in_group("hit"):
        area.on_hit()

最终解决方案: 我改变了on_body_entered,现在它可以交互了。 为了使用该方法,我使用了area.has_method(“on_hit”),而不是area.is_in_group。 现在可以了! 如果有人可以解释为什么它不适用于 body_entered 和 is_in_group,我真的很感激它对于未来的发展:)

signals nodes godot4
1个回答
0
投票

最终解决方案: 我把on_body_entered改成了on_area_entered,现在可以交互了。 为了使用该方法,我使用了area.has_method(“on_hit”),而不是area.is_in_group。

现在可以用了!

如果有人可以解释为什么它不能与 body_entered 和 is_in_group 一起使用,我真的很感激它对于未来的发展:)

© www.soinside.com 2019 - 2024. All rights reserved.