跳转至

Godot 音频 — 快速参考

最后验证:2026-02-12 | 引擎:Godot 4.6

自 ~4.3(LLM 知识截止)以来的变更

在 4.4–4.6 中,音频 API 没有重大破坏性变更。核心音频系统保持稳定。主要更新是一些工作流改进:

4.6 变更

  • 本版本没有音频相关的破坏性变更。

4.5 变更

  • 本版本没有音频相关的破坏性变更。

当前 API 模式

播放音频

@onready var sfx_player: AudioStreamPlayer = %SFXPlayer
@onready var music_player: AudioStreamPlayer = %MusicPlayer

func play_sfx(stream: AudioStream) -> void:
    sfx_player.stream = stream
    sfx_player.play()

func play_music(stream: AudioStream, fade_time: float = 1.0) -> void:
    var tween: Tween = create_tween()
    tween.tween_property(music_player, "volume_db", -80.0, fade_time)
    await tween.finished
    music_player.stream = stream
    music_player.volume_db = 0.0
    music_player.play()

3D 空间音频

@onready var audio_3d: AudioStreamPlayer3D = %AudioPlayer3D

func _ready() -> void:
    audio_3d.max_distance = 50.0
    audio_3d.attenuation_model = AudioStreamPlayer3D.ATTENUATION_INVERSE_DISTANCE
    audio_3d.unit_size = 10.0

音频总线

# Set bus volumes
AudioServer.set_bus_volume_db(AudioServer.get_bus_index(&"Music"), volume_db)
AudioServer.set_bus_volume_db(AudioServer.get_bus_index(&"SFX"), volume_db)

# Mute a bus
AudioServer.set_bus_mute(AudioServer.get_bus_index(&"Music"), true)

SFX 的对象池化

# Pre-create multiple AudioStreamPlayer nodes for concurrent sounds
var _sfx_pool: Array[AudioStreamPlayer] = []

func _ready() -> void:
    for i in range(8):
        var player := AudioStreamPlayer.new()
        player.bus = &"SFX"
        add_child(player)
        _sfx_pool.append(player)

func play_pooled(stream: AudioStream) -> void:
    for player in _sfx_pool:
        if not player.playing:
            player.stream = stream
            player.play()
            return

常见错误

  • 在运行时创建新的 AudioStreamPlayer 节点,而不是进行对象池化
  • 未使用音频总线来管理音量分类(Music、SFX、UI、Voice)
  • 使用 _process() 处理音频时序,而不是使用信号(finished)

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/Claude-Code-Game-Studios