Audio
Formats: Ogg Vorbis (music, loopable), WAV (short SFX), MP3.
25.1 Players
Non-positional (music, UI) Positional 2D (attenuates with distance from the listener/camera)
Positional 3D (attenuation, doppler, area reverb) Formats: Ogg Vorbis (music, loopable), WAV (short SFX), MP3. Set loop in the import settings.
Set max_polyphony > 1 on a player to let the same player overlap sounds. AudioStreamRandomizer picks random streams/pitch automatically.
@onready var sfx: AudioStreamPlayer2D = $JumpSound
func jump() -> void:
sfx.pitch_scale = randf_range(0.9, 1.1) # variation
sfx.play()
func play_one_shot(stream: AudioStream, at: Vector2) -> void:
var p := AudioStreamPlayer2D.new()
p.stream = stream
p.global_position = at
p.finished.connect(p.queue_free)
get_tree().current_scene.add_child(p)
p.play()25.2 Audio buses
The Audio bottom panel defines buses (Master, Music, SFX) with effects (reverb, compressor, EQ, limiter). Players choose a bus with the bus property.
func set_bus_volume(bus_name: String, linear: float) -> void:
var idx := AudioServer.get_bus_index(bus_name)
AudioServer.set_bus_volume_db(idx, linear_to_db(linear)) # slider 0..1 → decibels
AudioServer.set_bus_mute(idx, linear <= 0.001)25.3 Music manager (autoload)
Godot 4.3 added interactive music resources (AudioStreamInteractive, AudioStreamPlaylist, AudioStreamSynchronized) for transitions and layered music.
extends Node
var _player := AudioStreamPlayer.new()
func _ready() -> void:
_player.bus = &"Music"
process_mode = Node.PROCESS_MODE_ALWAYS # keep playing while paused
add_child(_player)
func play_music(stream: AudioStream, fade := 1.0) -> void:
if _player.stream == stream and _player.playing:
return
var tween := create_tween()
if _player.playing:
tween.tween_property(_player, "volume_db", -40.0, fade)
tween.tween_callback(func():
_player.stream = stream
_player.play())
tween.tween_property(_player, "volume_db", 0.0, fade)