2023-09-30 13:25:08 -04:00
|
|
|
extends StaticBody3D
|
|
|
|
|
|
|
|
signal triggered(by_what: Node3D)
|
|
|
|
|
|
|
|
|
|
|
|
@export_category('Button')
|
|
|
|
@export
|
|
|
|
var momentary: bool = false
|
|
|
|
|
|
|
|
@export_subgroup('Material')
|
|
|
|
@export
|
|
|
|
var released_material: StandardMaterial3D = null
|
|
|
|
@export
|
|
|
|
var pressed_material: StandardMaterial3D = null
|
|
|
|
|
|
|
|
# NOTE: These functions need to use the $ notation instead of the @onready sound
|
|
|
|
# because it seems like the editor calls these before @onready fires.
|
|
|
|
# Not sure why this doesnt work...
|
|
|
|
@export_subgroup('Sound')
|
|
|
|
@export
|
2023-10-01 23:39:28 -04:00
|
|
|
var press_sound: AudioStream = null
|
|
|
|
@export
|
|
|
|
var release_sound: AudioStream = null
|
2023-09-30 13:25:08 -04:00
|
|
|
|
|
|
|
@export_range(-80, 80, 1, "suffix:dB")
|
|
|
|
var volume = 0.0 :
|
|
|
|
get:
|
|
|
|
return $AudioStreamPlayer3D.volume_db
|
|
|
|
set(value):
|
|
|
|
$AudioStreamPlayer3D.volume_db = value
|
|
|
|
|
|
|
|
|
|
|
|
@onready
|
|
|
|
var _anim = $AnimationPlayer
|
|
|
|
@onready
|
|
|
|
var _button = $CSGMesh3D
|
|
|
|
@onready
|
|
|
|
var _sound = $AudioStreamPlayer3D
|
|
|
|
|
|
|
|
|
|
|
|
var _triggered = false
|
|
|
|
var _resetting = false
|
|
|
|
|
|
|
|
|
|
|
|
func _ready():
|
|
|
|
_anim.animation_finished.connect(_on_anim_finished)
|
|
|
|
|
|
|
|
|
|
|
|
func interact(other):
|
|
|
|
if _triggered:
|
|
|
|
return
|
|
|
|
_triggered = true
|
2023-10-01 23:43:16 -04:00
|
|
|
|
2023-09-30 13:25:08 -04:00
|
|
|
triggered.emit(other)
|
2023-10-01 23:39:28 -04:00
|
|
|
_sound.stream = press_sound
|
2023-09-30 13:25:08 -04:00
|
|
|
_sound.play()
|
|
|
|
_anim.play('trigger')
|
|
|
|
_button.material = pressed_material
|
|
|
|
|
|
|
|
|
|
|
|
func _on_anim_finished(name):
|
|
|
|
if _resetting:
|
2023-10-02 00:40:13 -04:00
|
|
|
_sound.stop()
|
|
|
|
_sound.stream = release_sound
|
|
|
|
_sound.play()
|
2023-09-30 13:25:08 -04:00
|
|
|
_button.material = released_material
|
|
|
|
_resetting = false
|
|
|
|
_triggered = false
|
2023-10-01 23:43:16 -04:00
|
|
|
|
2023-09-30 13:25:08 -04:00
|
|
|
if momentary and _triggered:
|
|
|
|
_anim.play_backwards('trigger')
|
|
|
|
_resetting = true
|
|
|
|
|