41 lines
1.2 KiB
GDScript
41 lines
1.2 KiB
GDScript
# 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))
|