Хорошо. Я сделал простой проект для проверки столкновения и процесса queue_free()
в отношении взаимодействия между KinematicBody
и Area2D
. По сути, Area2D
- это объект, который обнаруживает и сигнализирует о столкновении (KinematicBody
может вызвать столкновение, но не может его обнаружить). Следовательно, до Area2D
можно обнаружить, когда тело вступило (или в этом случае, когда оно входит в тело), и затем оно может сигнализировать о столкновении, которое затем вызывает функцию _on_Area2D_body_entered
в другом объекте, и затем выполняет queue_free()
в соответствии с инструкциями.
Настройка моего узла выглядит следующим образом:
Node2D
|_Area2D - (SIGNAL ATTACHED - "_on_body_entered()" - CONNECTED TO KINEMATIC BODY)
| |_Sprite
| |_CollisionShape2D
|
|_KinematicBody2D
|_Sprite
|_CollisionShape2D
Для моего испытания объект Area2D
расположен на той же горизонтальной оси и слева от KinematicBody
СЦЕНАРИЙ, ПРИЛОЖЕННЫЙ К ОБЛАСТИ:
extends Area2D
func _ready():
pass
func _process(delta):
self.position.x += 1 #So it moves into and collides with other object.
СЦЕНАРИЙ, СВЯЗАННЫЙ С КИНЕМАТИЧЕСКИМ ТЕЛО:
extends KinematicBody2D
func _ready():
pass
func _on_Area2D_body_entered(body): # This is called when Area2D detects a collision
queue_free()
print("HIT!!!!!") #To doubly confirm the collision is recognized
К сожалению, так и должно быть. Поскольку Area2D
является единственным объектом в этом сценарии, который способен обнаруживать и сигнализировать о столкновении, он не может быть приказан самому queue_free()
, так как Годо выдает ошибку при попытке сделать это.
В качестве альтернативы, однако, если вы хотите, чтобы это было наоборот - для KinematicBody
нужно двигаться к объекту Area2D
и удалять себя при ударе. просто переместите весь дельта-процесс из сценария Area2D
и поместите его в сценарий KinematicBody
над _on_Area2D_body_entered(body)
и измените self.position.x
на -= 1
. Оставьте сигнал на Area2D
.