87 lines
2.4 KiB
GDScript
87 lines
2.4 KiB
GDScript
extends XRController3D
|
|
|
|
@export var weapon_scene: PackedScene
|
|
@export var weapon_offset := Vector3(0, 0, -0.1)
|
|
@export var weapon_rotation := Vector3(0, 0, 0)
|
|
@export var equip_duration := 0.3
|
|
|
|
var current_weapon: Weapon = null
|
|
var weapon_equipped := false
|
|
var is_animating := false
|
|
|
|
func _ready():
|
|
button_pressed.connect(_on_button_pressed)
|
|
button_released.connect(_on_button_released)
|
|
|
|
func _on_button_pressed(button: String):
|
|
match button:
|
|
"grip_click":
|
|
if not is_animating:
|
|
equip_weapon()
|
|
"trigger_click":
|
|
if weapon_equipped and current_weapon and not is_animating:
|
|
if current_weapon.shoot():
|
|
trigger_haptic_pulse("haptic", 0, 0.5, 0.1, 0)
|
|
|
|
func _on_button_released(button: String):
|
|
match button:
|
|
"grip_click":
|
|
if not is_animating:
|
|
unequip_weapon()
|
|
|
|
func equip_weapon():
|
|
if weapon_equipped or not weapon_scene or is_animating:
|
|
return
|
|
|
|
is_animating = true
|
|
|
|
# Waffe instanzieren
|
|
current_weapon = weapon_scene.instantiate() as Weapon
|
|
add_child(current_weapon)
|
|
|
|
# Startposition (außerhalb Sichtfeld)
|
|
current_weapon.position = weapon_offset + Vector3(0, -0.5, 0)
|
|
current_weapon.rotation_degrees = weapon_rotation
|
|
current_weapon.scale = Vector3.ZERO
|
|
|
|
# Smooth Animation
|
|
var tween = create_tween()
|
|
tween.set_parallel(true)
|
|
tween.tween_property(current_weapon, "position", weapon_offset, equip_duration)\
|
|
.set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT)
|
|
tween.tween_property(current_weapon, "scale", Vector3.ONE, equip_duration)\
|
|
.set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT)
|
|
|
|
tween.finished.connect(func():
|
|
weapon_equipped = true
|
|
is_animating = false
|
|
)
|
|
|
|
# Haptisches Feedback
|
|
trigger_haptic_pulse("haptic", 0, 0.3, 0.05, 0)
|
|
|
|
func unequip_weapon():
|
|
if not weapon_equipped or not current_weapon or is_animating:
|
|
return
|
|
|
|
is_animating = true
|
|
weapon_equipped = false
|
|
|
|
# Smooth Animation
|
|
var tween = create_tween()
|
|
tween.set_parallel(true)
|
|
tween.tween_property(current_weapon, "position", weapon_offset + Vector3(0, -0.5, 0), equip_duration)\
|
|
.set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_IN)
|
|
tween.tween_property(current_weapon, "scale", Vector3.ZERO, equip_duration)\
|
|
.set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_IN)
|
|
|
|
tween.finished.connect(func():
|
|
if current_weapon:
|
|
current_weapon.queue_free()
|
|
current_weapon = null
|
|
is_animating = false
|
|
)
|
|
|
|
# Haptisches Feedback
|
|
trigger_haptic_pulse("haptic", 0, 0.2, 0.05, 0)
|