HOME / 第 6 部分 · 数据与进阶开发 / 第 73 课
MODULE 6 · 数据与进阶开发
第 73 课 · 音频进阶:动态音乐与混音
🎯 本课学习目标
- 实现音量平滑渐变
- 根据游戏状态切换音乐
- 用音频总线做音效分层
音乐随情绪变化、音量平滑过渡——本课把音频系统做专业。
📖 详细教学步骤
音量平滑渐变代码
直接用 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 淡入淡出、随机音效防单调、播放器池支持多音效同时、交互式音乐做动态段落。