# KillZone.gd extends Area3D # Position, an der gefallene Objekte wieder erscheinen sollen @export var respawn_position: Vector3 = Vector3(5, 1, 5) # Optional: minimale Y-Grenze zum Sicherheitscheck (z. B. falls Physik aussetzt) @export var y_limit: float = -20.0 func _on_body_entered(body: Node) -> void: # Nur bewegliche oder greifbare Objekte behandeln if body is RigidBody3D or body is CharacterBody3D or body.is_in_group("pickable"): _reset_body_position(body) func _physics_process(_delta: float) -> void: # Fallback: falls ein Objekt unter y_limit fällt, respawnen for body in get_tree().get_nodes_in_group("pickable"): if body.global_position.y < y_limit: _reset_body_position(body) func _reset_body_position(body: Node) -> void: # Falls Objekt ein XRToolsPickable ist if body.has_method("is_picked_up") and body.is_picked_up(): # Objekt aus der Hand lösen if body.has_method("drop"): body.drop() # Bewegung stoppen, falls RigidBody if body is RigidBody3D: body.linear_velocity = Vector3.ZERO body.angular_velocity = Vector3.ZERO # Position zurücksetzen body.global_position = respawn_position # Optional leicht anheben, um Kollision mit Boden zu vermeiden body.translate(Vector3(0, 0.05, 0))