add rain sound
This commit is contained in:
@@ -19,6 +19,11 @@ extends Node3D
|
||||
@export var lightning_color: Color = Color(0.9, 0.9, 1.0)
|
||||
@export var lightning_flash_duration: float = 0.15
|
||||
|
||||
@export_group("Rain Audio")
|
||||
@export var rain_audio_enabled: bool = true
|
||||
@export var rain_volume_db_max: float = 0.0
|
||||
@export var rain_crossfade_threshold: float = 0.5
|
||||
|
||||
@export_group("Thunder")
|
||||
@export var thunder_enabled: bool = true
|
||||
@export var thunder_min_delay: float = 1.0
|
||||
@@ -42,6 +47,8 @@ var _lightning_light: DirectionalLight3D
|
||||
var _thunder_player: AudioStreamPlayer
|
||||
var _thunder_pending: bool = false
|
||||
var _thunder_delay_timer: float = 0.0
|
||||
var _rain_light_player: AudioStreamPlayer
|
||||
var _rain_hard_player: AudioStreamPlayer
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
@@ -49,6 +56,7 @@ func _ready() -> void:
|
||||
_create_snow_system()
|
||||
_create_lightning_light()
|
||||
_create_thunder_player()
|
||||
_create_rain_audio_players()
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
@@ -67,6 +75,7 @@ func _process(delta: float) -> void:
|
||||
|
||||
_process_lightning(delta)
|
||||
_process_thunder(delta)
|
||||
_process_rain_audio()
|
||||
_follow_camera()
|
||||
|
||||
|
||||
@@ -130,6 +139,66 @@ func _create_thunder_player() -> void:
|
||||
add_child(_thunder_player)
|
||||
|
||||
|
||||
func _create_rain_audio_players() -> void:
|
||||
_rain_light_player = AudioStreamPlayer.new()
|
||||
_rain_light_player.name = "RainLightPlayer"
|
||||
_rain_light_player.volume_db = -80.0
|
||||
_rain_light_player.bus = "Master"
|
||||
_rain_light_player.stream = load("res://resources/rain_light.mp3")
|
||||
add_child(_rain_light_player)
|
||||
|
||||
_rain_hard_player = AudioStreamPlayer.new()
|
||||
_rain_hard_player.name = "RainHardPlayer"
|
||||
_rain_hard_player.volume_db = -80.0
|
||||
_rain_hard_player.bus = "Master"
|
||||
_rain_hard_player.stream = load("res://resources/rain_gentle.mp3")
|
||||
add_child(_rain_hard_player)
|
||||
|
||||
|
||||
func _process_rain_audio() -> void:
|
||||
if not rain_audio_enabled:
|
||||
if _rain_light_player.playing:
|
||||
_rain_light_player.stop()
|
||||
if _rain_hard_player.playing:
|
||||
_rain_hard_player.stop()
|
||||
return
|
||||
|
||||
if _current_rain < 0.01:
|
||||
if _rain_light_player.playing:
|
||||
_rain_light_player.stop()
|
||||
if _rain_hard_player.playing:
|
||||
_rain_hard_player.stop()
|
||||
return
|
||||
|
||||
# Below threshold: only light rain plays, volume scales linearly 0 → max
|
||||
# Above threshold: light rain fades out, hard rain fades in
|
||||
if _current_rain <= rain_crossfade_threshold:
|
||||
# Light rain: volume from 0 to max based on percentage within the range
|
||||
var light_vol := _current_rain / rain_crossfade_threshold
|
||||
_set_rain_player(_rain_light_player, light_vol)
|
||||
_stop_rain_player(_rain_hard_player)
|
||||
else:
|
||||
# Crossfade zone: light fades out, hard fades in
|
||||
var t := (_current_rain - rain_crossfade_threshold) / (1.0 - rain_crossfade_threshold)
|
||||
_set_rain_player(_rain_light_player, 1.0 - t)
|
||||
_set_rain_player(_rain_hard_player, t)
|
||||
|
||||
|
||||
func _set_rain_player(player: AudioStreamPlayer, weight: float) -> void:
|
||||
if weight < 0.001:
|
||||
_stop_rain_player(player)
|
||||
return
|
||||
if not player.playing:
|
||||
player.volume_db = -80.0
|
||||
player.play()
|
||||
player.volume_db = lerpf(-80.0, rain_volume_db_max, weight)
|
||||
|
||||
|
||||
func _stop_rain_player(player: AudioStreamPlayer) -> void:
|
||||
if player.playing:
|
||||
player.stop()
|
||||
|
||||
|
||||
func _create_lightning_light() -> void:
|
||||
_lightning_light = DirectionalLight3D.new()
|
||||
_lightning_light.name = "LightningFlash"
|
||||
|
||||
Reference in New Issue
Block a user