first commit
This commit is contained in:
commit
21b4e73ed7
906 changed files with 65701 additions and 0 deletions
101
Scripts/FoliageArea.gd
Normal file
101
Scripts/FoliageArea.gd
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
extends Area3D
|
||||
|
||||
var collider_audio_pair = []
|
||||
|
||||
@export var rustle_sounds: PackedScene
|
||||
@export var placeholder: CollisionShape3D
|
||||
|
||||
const VELOCITY_ATTENUATION_THRESHOLD = 3.0
|
||||
const ATTENUATION_ADJUST_SPEED = 200.0
|
||||
const FADE_IN_OUT = 0.15
|
||||
|
||||
@onready var rustle_sounds_loaded = load(rustle_sounds.resource_path)
|
||||
|
||||
func _ready():
|
||||
placeholder.queue_free()
|
||||
var colliders = find_children("*", "CollisionShape3D", true)
|
||||
for collider in colliders:
|
||||
collider.reparent(self, true)
|
||||
|
||||
body_entered.connect(_on_body_entered)
|
||||
body_exited.connect(_on_body_exited)
|
||||
|
||||
func _physics_process(delta):
|
||||
for pair in collider_audio_pair:
|
||||
pair["audio"].global_position = pair["collider"].global_position
|
||||
var atten_speed = ATTENUATION_ADJUST_SPEED * delta
|
||||
var atten_target = set_atten(pair["collider"], pair["audio"], true)
|
||||
if pair["audio"].volume_db > atten_target:
|
||||
atten_speed = atten_speed / 3.0
|
||||
pair["audio"].volume_db = move_toward(pair["audio"].volume_db, atten_target, atten_speed)
|
||||
|
||||
# should change to get_atten sometime
|
||||
func set_atten(phys_obj, audio, get_vol := false):
|
||||
var collider_velocity
|
||||
if phys_obj is CharacterBody3D:
|
||||
collider_velocity = phys_obj.get_real_velocity().length()
|
||||
else:
|
||||
if phys_obj.linear_velocity.length() > phys_obj.angular_velocity.length():
|
||||
collider_velocity = phys_obj.linear_velocity.length()
|
||||
else:
|
||||
collider_velocity = phys_obj.angular_velocity.length()
|
||||
|
||||
var rustle_atten = collider_velocity/VELOCITY_ATTENUATION_THRESHOLD
|
||||
rustle_atten = clamp(rustle_atten, 0.0, 1.0)
|
||||
|
||||
var vol = lerp(-80.0, 0.0, ease_out_circ(rustle_atten))
|
||||
if get_vol:
|
||||
return vol
|
||||
else:
|
||||
audio.volume_db = vol
|
||||
|
||||
func _on_body_entered(body):
|
||||
if body is RigidBody3D or CharacterBody3D:
|
||||
var rustle_sounds = rustle_sounds_loaded.instantiate()
|
||||
get_tree().root.get_child(0).add_child(rustle_sounds)
|
||||
|
||||
# is this fade in necessary? the move_towards behavior should already act as its own fade in right? only fade out is necessary due to abrupt deletion without it?
|
||||
var target_vol = set_atten(body, rustle_sounds, true)
|
||||
var fade_time = FADE_IN_OUT
|
||||
while fade_time > 0.0:
|
||||
rustle_sounds.global_position = body.global_position
|
||||
rustle_sounds.volume_db = lerp(-80.0, target_vol, (FADE_IN_OUT-fade_time)/FADE_IN_OUT)
|
||||
await get_tree().process_frame
|
||||
fade_time -= get_process_delta_time()
|
||||
|
||||
if overlaps_body(body):
|
||||
# this check sometimes fails because godot doesn't guarantee up to date results
|
||||
# so sometimes you'll get the bug where the foliage noise keeps on playing after you get out of foliage
|
||||
# i'm too tired to fix this, this script is bloated enough as it is
|
||||
# interestingly enough i've run into this bug in other AAA games as well
|
||||
collider_audio_pair.append({"collider": body, "audio": rustle_sounds})
|
||||
else:
|
||||
var from_vol = set_atten(body, rustle_sounds, true)
|
||||
var fade_time2 = FADE_IN_OUT
|
||||
while fade_time2 > 0.0:
|
||||
rustle_sounds.global_position = body.global_position
|
||||
rustle_sounds.volume_db = lerp(from_vol, -80.0, (FADE_IN_OUT-fade_time2)/FADE_IN_OUT)
|
||||
await get_tree().process_frame
|
||||
fade_time2 -= get_process_delta_time()
|
||||
rustle_sounds.queue_free()
|
||||
|
||||
func _on_body_exited(body):
|
||||
for pair in collider_audio_pair:
|
||||
if pair["collider"] == body:
|
||||
var temp_audio = pair["audio"]
|
||||
var temp_obj = pair["collider"]
|
||||
collider_audio_pair.erase(pair)
|
||||
|
||||
var from_vol = set_atten(body, rustle_sounds, true)
|
||||
var fade_time = FADE_IN_OUT
|
||||
while fade_time > 0.0:
|
||||
temp_audio.global_position = temp_obj.global_position
|
||||
temp_audio.volume_db = lerp(from_vol, -80.0, (FADE_IN_OUT-fade_time)/FADE_IN_OUT)
|
||||
await get_tree().process_frame
|
||||
fade_time -= get_process_delta_time()
|
||||
|
||||
temp_audio.queue_free()
|
||||
break
|
||||
|
||||
func ease_out_circ(lerp: float) -> float:
|
||||
return sqrt(1.0 - pow(lerp - 1.0, 2.0))
|
||||
Loading…
Add table
Add a link
Reference in a new issue