forked from funnymemellama/funnymemellama
71 lines
1.4 KiB
GDScript
71 lines
1.4 KiB
GDScript
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 sound: AudioStream = null :
|
|
get:
|
|
return $AudioStreamPlayer3D.stream
|
|
set(value):
|
|
$AudioStreamPlayer3D.stream = value
|
|
|
|
@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.play()
|
|
_anim.play('trigger')
|
|
_button.material = pressed_material
|
|
|
|
|
|
func _on_anim_finished(name):
|
|
if _resetting:
|
|
_button.material = released_material
|
|
_resetting = false
|
|
_triggered = false
|
|
|
|
if momentary and _triggered:
|
|
_anim.play_backwards('trigger')
|
|
_resetting = true
|
|
|