89 lines
2.0 KiB
GDScript
89 lines
2.0 KiB
GDScript
extends Interactable
|
|
class_name Button3D
|
|
|
|
signal pressed(button: Button3D)
|
|
signal held(button: Button3D)
|
|
signal released(button: Button3D)
|
|
|
|
@export var pressDepth: float = 0.05
|
|
@export var pressSpeed: float = 10.0
|
|
@export var autoReset: bool = true
|
|
@export var buttonMesh: MeshInstance3D
|
|
@export var holdMode: bool = false
|
|
@export var pressArea: Area3D
|
|
|
|
var isPressed: bool = false
|
|
var offset: float = 0.0
|
|
var pressing_body: Node3D = null
|
|
|
|
func _ready() -> void:
|
|
if pressArea:
|
|
pressArea.monitoring = true
|
|
pressArea.monitorable = true
|
|
|
|
func beginInteract(player, hitPosition: Vector3):
|
|
if holdMode:
|
|
isPressed = true
|
|
offset = pressDepth
|
|
emit_signal("pressed", self)
|
|
else:
|
|
if isPressed:
|
|
return
|
|
isPressed = true
|
|
offset = pressDepth
|
|
emit_signal("pressed", self)
|
|
|
|
func updateInteract(player):
|
|
if holdMode and isPressed:
|
|
emit_signal("held", self)
|
|
|
|
func endInteract(player):
|
|
if holdMode:
|
|
isPressed = false
|
|
offset = 0.0
|
|
emit_signal("released", self)
|
|
else:
|
|
if autoReset:
|
|
offset = 0.0
|
|
|
|
func _physics_process(delta):
|
|
var target = offset
|
|
var current = buttonMesh.position.z
|
|
var newZ = lerp(current, -target, delta * pressSpeed)
|
|
buttonMesh.position.z = newZ
|
|
|
|
if autoReset and isPressed and abs(newZ) < 0.001:
|
|
isPressed = false
|
|
|
|
#func _physics_process(delta):
|
|
## Detect rigidbody overlap
|
|
#var bodies = pressArea.get_overlapping_bodies()
|
|
#
|
|
#if bodies.size() > 0:
|
|
#var body = bodies[0]
|
|
#
|
|
#if pressing_body == null:
|
|
#pressing_body = body
|
|
#isPressed = true
|
|
#offset = pressDepth
|
|
#emit_signal("pressed", self)
|
|
#else:
|
|
#if holdMode:
|
|
#emit_signal("held", self)
|
|
#else:
|
|
#if pressing_body != null:
|
|
#pressing_body = null
|
|
#if autoReset:
|
|
#offset = 0.0
|
|
#isPressed = false
|
|
#emit_signal("released", self)
|
|
#
|
|
## Animate button
|
|
#var target = offset
|
|
#var current = buttonMesh.position.z
|
|
#var newZ = lerp(current, -target, delta * pressSpeed)
|
|
#buttonMesh.position.z = newZ
|
|
#
|
|
#if autoReset and isPressed and abs(newZ) < 0.001:
|
|
#isPressed = false
|