HOME / 第 6 部分 · 数据与进阶开发 / 第 73 课
MODULE 6 · 数据与进阶开发

第 73 课 · 音频进阶:动态音乐与混音

⏱ 预计时长 30 分钟📊 难度 进阶📚 模块 第 6 部分 · 数据与进阶开发

🎯 本课学习目标

音乐随情绪变化、音量平滑过渡——本课把音频系统做专业。

📖 详细教学步骤

音量平滑渐变代码

直接用 tween 平滑调音量,避免「咔哒」突变:

GDSCRIPTfunc set_volume_smooth(bus_name: String, target_db: float, duration: float = 0.5):
    var idx = AudioServer.get_bus_index(bus_name)
    var start = AudioServer.get_bus_volume_db(idx)
    var tween = create_tween()
    tween.tween_method(func(v):
        AudioServer.set_bus_volume_db(idx, v)
    , start, target_db, duration)

按状态切换 BGM代码

战斗/探索/菜单不同音乐,切换带淡入淡出:

GDSCRIPTextends Node

@onready var music: AudioStreamPlayer = $Music

func play_music(stream: AudioStream, fade: float = 1.0):
    if music.stream == stream:
        return
    var tween = create_tween()
    # 淡出
    tween.tween_property(music, "volume_db", -40.0, fade / 2)
    tween.tween_callback(func():
        music.stream = stream
        music.play()
    )
    # 淡入
    tween.tween_property(music, "volume_db", -6.0, fade / 2)

func enter_battle():
    play_music(load("res://audio/battle.ogg"))

func explore():
    play_music(load("res://audio/explore.ogg"))

随机音效(不单调)代码

同一动作随机选一个音效 + 随机音调:

GDSCRIPTvar footstep_sounds: Array[AudioStream] = []

func play_footstep():
    # 随机挑一个脚步音
    var s = footstep_sounds[randi() % footstep_sounds.size()]
    $Footstep.stream = s
    $Footstep.pitch_scale = randf_range(0.9, 1.1)
    $Footstep.play()

音效分层(同时多个)代码

一个播放器一次只能播一个,用「播放器池」:

GDSCRIPTvar pool: Array[AudioStreamPlayer] = []
const POOL_SIZE = 8

func _ready():
    for i in range(POOL_SIZE):
        var p = AudioStreamPlayer.new()
        p.bus = "SFX"
        add_child(p)
        pool.append(p)

func play_sfx(stream: AudioStream, vol: float = 0.0):
    # 找一个空闲播放器
    for p in pool:
        if not p.playing:
            p.stream = stream
            p.volume_db = vol
            p.play()
            return

音乐实时参数(进阶)进阶

Godot 4 支持 AudioStreamInteractive 做动态音乐:

  • 根据游戏状态(战斗/安全)无缝切换音乐段落
  • 通过 AudioStreamPlaybackInteractive 控制
  • 适合做节奏类/恐怖游戏

先掌握基础切换,交互式音乐按需探索。

⚠️
音量突变刺耳?

所有音量变化都用 tween 渐变,特别是总线音量。

⚠️
多个音效抢一个播放器?

用播放器池(数组轮换),而不是单个播放器。

🧪 动手试一试

🏋️ 课后练习

给平台跳跃游戏加状态音乐:探索时悠闲 BGM,进入战斗区自动切战斗 BGM(淡入淡出),脚步音随机。

Area2D 检测进入战斗区 → play_music(battle);脚步用播放器池+随机音调。

💡

音乐是情绪放大器,切换时务必淡入淡出。

💡

脚步声每走一步随机 pitch,真实感大增。

🎓 本课小结

音频进阶:tween 平滑音量、按状态切换 BGM 淡入淡出、随机音效防单调、播放器池支持多音效同时、交互式音乐做动态段落。