Improved footstep detection

This commit is contained in:
2024-02-15 00:20:26 +01:00
parent 07f356a8cc
commit 17a507d07c
7 changed files with 86 additions and 39 deletions

View File

@ -4,49 +4,47 @@ extends Node
@export var skeleton: Skeleton3D
@export var movement: MovementComponent
@export var footsteps: Array[AudioStream]
@export var raise_threshold := 0.25
@export var step_threshold := 0.15
@export var step_threshold := 0.1
var feet_names := ["LeftFoot", "RightFoot"]
var feet := []
var feet_audio := []
var feet_raised := []
var feet_position := []
const feet_names := ["LeftFoot", "RightFoot"]
var feet: Array[Foot] = []
func _ready():
for foot_name in feet_names:
var bone_id := skeleton.find_bone(foot_name)
var audio := get_node(foot_name)
var foot = Foot.new()
foot.bone_name = foot_name
foot.bone_id = skeleton.find_bone(foot_name)
foot.audio = get_node(foot_name)
foot.position = skeleton.to_global(skeleton.get_bone_global_pose(foot.bone_id).origin)
foot.attachment = BoneAttachment3D.new()
foot.attachment.bone_name = foot_name
foot.attachment.bone_idx = foot.bone_id
foot.audio.reparent(foot.attachment)
skeleton.add_child(foot.attachment)
feet.append(foot)
feet.append(bone_id)
feet_audio.append(audio)
feet_raised.append(false)
feet_position.append(Vector3.ZERO)
func _process(delta: float):
for foot in feet:
var old_position := foot.position
foot.position = skeleton.to_global(skeleton.get_bone_global_pose(foot.bone_id).origin)
foot.velocity = (foot.position - old_position) / delta
var attachment := BoneAttachment3D.new()
attachment.bone_name = foot_name
attachment.bone_idx = bone_id
audio.reparent(attachment)
skeleton.add_child(attachment)
func _process(_delta):
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
if foot.position.y > step_threshold:
continue
if foot.velocity.y > 0:
continue
if foot.velocity.length_squared() < 1.0:
continue
if foot.audio.playing && foot.audio.get_playback_position() < 0.3:
continue
play(foot.audio)
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()
audio_player.play()

View File

@ -0,0 +1,8 @@
class_name Foot
var bone_name: String
var bone_id: int
var audio: AudioStreamPlayer3D
var position: Vector3
var velocity: Vector3
var attachment: BoneAttachment3D