为什么我的敌人在 godot 引擎启动时消失了

Why are my enemies disappearing on startup in the godot engine

我对 godot 引擎比较陌生,对 3.3.2 版本的敌人消失有疑问。在编辑器中,敌人节点的位置正确。但是,当我单击播放按钮时,它们会从游戏中消失。这是我的敌人脚本:

extends KinematicBody2D

var motion = Vector2()

var Health = 100

var bullet = preload("res://Art/Bullet.png")
var explosion = load("res://Particles.tscn").instance()
var bulletSpeed = 1000

func _process(delta):


  if Health <= 0:
     queue_free()
     print(position)

func _physics_process(delta):
    var world = get_parent()
    var Player = world.get_node("Player")


    position += (Player.position - position)/40
    
    move_and_collide(motion)



func _on_Area2D_body_entered(body):

    
    Health -= 20

   body.queue_free()
   queue_free()

这是我的整个项目:https://github.com/Ripple-Studios/Godot-Wild-Jam-36-Game-Ripple-Studios。这种情况下的问题是什么?

谢谢,

通过查看问题中的代码:

  • 如果动作有问题,可能会使敌人移动到意想不到的位置:
    • 变量 motion 将始终为 Vector2.ZERO,除非您通过其他代码设置它。
    • 看来您的所有动作都是通过写入 position 来驱动的。
  • 您调用了 queue_free,这可能是在移除敌人。

此外,您还有未使用的变量。


在 运行 您的链接代码之后:

  • 所有敌人的运动都是由position驱动的(知道碰撞不会阻止它的移动),你的motionmove_and_slide什么都不做。
  • 播放器a child Area2D信号连接无效。 Area2D 也与其 parent(在本例中为玩家)发生碰撞。这会导致错误,因为它找不到要调用的方法。
  • 敌人有一个 child Area2D 会触发 "body_entered" 信号,因为它正在与其 parent(敌人本身)发生碰撞。结果调用 _on_Area2D_body_entered,调用 queue_free,移除敌人。 这就是你问的问题。

对于解决方案,您可以:

  • _on_Area2D_body_entered 中检查它碰撞的是什么,如果是它本身,什么也不做。 利用具有is_in_group. See also Groups的节点组也是一种常见的做法。
  • 使用碰撞层和蒙版使 Area2D 不会与其 parent 发生碰撞。 请注意,图层和蒙版可能无法按您预期的那样工作。有建议改一下:Make physics layers and masks logic simple and consistent.