您好,感谢您的宝贵时间:) 我尝试制作一把简单的剑来攻击并击中蘑菇,击中蘑菇时应该播放动画。由于某种原因,它永远不会与我的剑互动,就好像它在不同的层上一样。
场景层次结构是一个玩家场景,我在其中添加了 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,我真的很感激它对于未来的发展:)
最终解决方案: 我把on_body_entered改成了on_area_entered,现在可以交互了。 为了使用该方法,我使用了area.has_method(“on_hit”),而不是area.is_in_group。
现在可以用了!
如果有人可以解释为什么它不能与 body_entered 和 is_in_group 一起使用,我真的很感激它对于未来的发展:)