Improved footstep detection
This commit is contained in:
@ -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()
|
||||
|
8
client/player/audio/Foot.gd
Normal file
8
client/player/audio/Foot.gd
Normal 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
|
Reference in New Issue
Block a user