Improved footstep audio
This commit is contained in:
@ -1,27 +1,52 @@
|
||||
class_name AudioComponent
|
||||
extends Node
|
||||
|
||||
@export var skeleton: Skeleton3D
|
||||
@export var movement: MovementComponent
|
||||
@export var footsteps: Array[AudioStream]
|
||||
@export var interval: float = 0.3
|
||||
@export var raise_threshold := 0.25
|
||||
@export var step_threshold := 0.15
|
||||
|
||||
var audio_player: AudioStreamPlayer3D
|
||||
var last_footstep: float
|
||||
var feet_names := ["LeftFoot", "RightFoot"]
|
||||
var feet := []
|
||||
var feet_audio := []
|
||||
var feet_raised := []
|
||||
var feet_position := []
|
||||
|
||||
func _ready():
|
||||
audio_player = $Footsteps
|
||||
for foot_name in feet_names:
|
||||
var bone_id := skeleton.find_bone(foot_name)
|
||||
var audio := get_node(foot_name)
|
||||
|
||||
feet.append(bone_id)
|
||||
feet_audio.append(audio)
|
||||
feet_raised.append(false)
|
||||
feet_position.append(Vector3.ZERO)
|
||||
|
||||
var attachment := BoneAttachment3D.new()
|
||||
attachment.bone_name = foot_name
|
||||
attachment.bone_idx = bone_id
|
||||
audio.reparent(attachment)
|
||||
skeleton.add_child(attachment)
|
||||
|
||||
func _process(_delta):
|
||||
if Time.get_unix_time_from_system() - last_footstep < interval:
|
||||
return
|
||||
|
||||
if movement.direction == Vector3.ZERO:
|
||||
return
|
||||
print()
|
||||
for i in range(feet.size()):
|
||||
feet_position[i] = skeleton.get_bone_global_pose(feet[i]).origin
|
||||
print(feet_position[i].y)
|
||||
|
||||
if feet_position[i].y > raise_threshold:
|
||||
feet_raised[i] = true
|
||||
|
||||
if !movement.body.is_on_floor():
|
||||
return
|
||||
|
||||
for i in range(feet.size()):
|
||||
if feet_raised[i] && feet_position[i].y < step_threshold:
|
||||
play(feet_audio[i])
|
||||
feet_raised[i] = false
|
||||
|
||||
func play(audio_player: AudioStreamPlayer3D):
|
||||
audio_player.stream = footsteps[randi_range(0, footsteps.size()-1)]
|
||||
audio_player.pitch_scale = randf_range(0.9, 1.1)
|
||||
audio_player.play()
|
||||
last_footstep = Time.get_unix_time_from_system()
|
||||
audio_player.play()
|
@ -5,6 +5,10 @@
|
||||
[node name="Audio" type="Node3D"]
|
||||
script = ExtResource("1_0j3jl")
|
||||
|
||||
[node name="Footsteps" type="AudioStreamPlayer3D" parent="."]
|
||||
[node name="LeftFoot" type="AudioStreamPlayer3D" parent="."]
|
||||
max_distance = 20.0
|
||||
bus = &"Footsteps"
|
||||
|
||||
[node name="RightFoot" type="AudioStreamPlayer3D" parent="."]
|
||||
max_distance = 20.0
|
||||
bus = &"Footsteps"
|
||||
|
Reference in New Issue
Block a user