HOME / 第 4 部分 · UI 界面 · 动画 · 特效 / 第 44 课
MODULE 4 · UI 界面 · 动画 · 特效

第 44 课 · 音效与背景音乐

⏱ 预计时长 30 分钟📊 难度 入门📚 模块 第 4 部分 · UI 界面 · 动画 · 特效

🎯 本课学习目标

好游戏离不开声音。本课学会播放音效与背景音乐。

📖 详细教学步骤

导入音频文件素材

  1. 准备音频文件(WAV/MP3/OGG 等)
  2. 拖入资源面板的 audio/ 文件夹
  3. 点击文件可在底部查看播放

💡 音效推荐 WAV(清晰)、音乐推荐 OGG/MP3(体积小)。

播放音效实操

  1. 添加节点 AudioStreamPlayer,命名 SfxPlayer
  2. 检查器 Stream → 选择音频文件
  3. 用代码播放:
GDSCRIPTextends Node

@onready var sfx: AudioStreamPlayer = $SfxPlayer

func play_coin():
    sfx.stream = load("res://audio/coin.wav")
    sfx.play()   # 从头播放

播完自动停止 & 音量属性

  • Volume dB:音量(0 正常,-10 更小,负无穷静音)
  • Pitch Scale:音调(1 正常,2 变尖,0.5 变低沉)
  • 检测播完:监听 finished 信号
  • 常用:sfx.pitch_scale = randf_range(0.9, 1.1) 让音效不单调

背景音乐(循环)实操

音乐单独用一个节点,循环播放:

GDSCRIPTextends Node

@onready var music: AudioStreamPlayer = $Music

func _ready():
    music.stream = load("res://audio/bgm.ogg")
    music.autoplay = true    # 进入场景自动播
    music.volume_db = -6     # 音乐小一点,不抢音效
    # 循环:检查器 Music 节点的 Stream 里设置循环,或代码:
    # music.stream.loop_mode = AudioStreamWAV.LOOP_FORWARD

音乐切换与淡入淡出进阶

切 BGM 用 Tween 淡入淡出更专业:

GDSCRIPTfunc crossfade_music(new_stream):
    var tween = create_tween()
    tween.tween_property(music, "volume_db", -30.0, 1.0)  # 淡出
    tween.tween_callback(func():
        music.stream = new_stream
        music.play()
    )
    tween.tween_property(music, "volume_db", -6.0, 1.0)   # 淡入

音效播放器的坑注意

一个 AudioStreamPlayer 同时只能播一个音效,连续快速触发会重头播。解决:

  • 用多个播放器实例(轮换)
  • 或用 AudioStreamPlayer2D 做带定位的声音(第 45 课)
  • 音效不宜过长,0.1-2 秒最佳
⚠️
没有声音?

检查:①系统/编辑器音量;②Stream 是否设置;③是否调用了 play();④Volume dB 是否太低(-80 以下基本听不到)。

⚠️
音效每次被重置(听不出连续)?

单播放器会重头播。快速音效用多个实例或 AudioStreamPlayer2D。

🧪 动手试一试

🏋️ 课后练习

给金币加「叮」音效、给跳跃加音效,并配一段循环背景音乐,音量合适不刺耳。

SFX 用 AudioStreamPlayer + play();BGM 用 autoplay + 循环 + 音量 -6dB。

💡

给不同音效设置不同 pitch_scale,让音效不单调。

💡

背景音乐单独一个播放器,音效用另一个,方便分别调音量。

🎓 本课小结

AudioStreamPlayer 播放音频:Stream 设文件、play() 播放、Volume dB 调音量、Pitch Scale 调音调;BGM 循环 + autoplay;多音效用多实例。