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 var press_sound: AudioStream = null @export var release_sound: AudioStream = null @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 triggered.emit(other) _sound.stream = press_sound _sound.play() _anim.play('trigger') _button.material = pressed_material func _on_anim_finished(name): if _resetting: _sound.stop() _sound.stream = release_sound _sound.play() _button.material = released_material _resetting = false _triggered = false if momentary and _triggered: _anim.play_backwards('trigger') _resetting = true