零音频文件:用纯代码生成 8-bit 游戏音效
godot-game-one 里没有任何 .wav、.ogg、.mp3 文件。所有音效——射击、爆炸、受击、UI 提示——全部在运行时用 GDScript 计算生成。两个脚本 sfx_manager.gd 和 bgm_manager.gd 承担了全部音频职责。
graph TD
A[游戏启动] --> B[SFX 单例初始化]
A --> C[BGM 单例初始化]
B --> D[预生成 6 个音效]
D --> D1[play_shoot - Sweep]
D --> D2[play_explosion - Noise]
D --> D3[play_enemy_death - Sweep]
D --> D4[play_player_hurt - Tone]
D --> D5[play_ui_confirm - Tone]
D --> D6[play_ui_select - Tone]
C --> E[生成 BGM 音频]
E --> E1[游戏 BGM - 三层立体声]
E --> E2[Boss BGM - pitch 加速]
三种波形,覆盖全部场景
整个音效系统只用了三种基础波形,全部通过计算 PCM 采样值实现:
| 波形 | 原理 | 用途 |
|---|---|---|
| Tone(正弦波) | sin(phase * TAU) + 指数衰减 |
UI 音效、受击反馈 |
| Sweep(频率扫描) | 频率线性插值 lerp(start, end, t) |
射击、敌人死亡 |
| Noise(白噪声) | randf_range(-1, 1) + 快速衰减 |
爆炸 |
核心实现(Tone 生成器):
1 | # sfx_manager.gd |
Sweep 和 Noise 的实现几乎相同,区别仅在于核心采样公式。6 个游戏音效就是这三种波形的不同参数组合:
1 | # sfx_manager.gd 中的公开接口 |
预生成的 6 个音效参数(在 _ready 中初始化):
1 | _stream_shoot = _generate_sweep(1200.0, 400.0, 0.06, 0.15) |
BGM:立体声合成器 + pitch 切换
背景音乐同样是程序化生成,但比音效复杂得多——bgm_manager.gd 的 _generate_bgm() 生成一段 12 秒的立体声音频,内部有三层声部叠加:
1 | # bgm_manager.gd |
三层声部在每个采样点叠加输出:Pad 提供和声铺底(sine + 泛音),Bass 提供低频节奏(soft attack/decay),Melody 提供主旋律(带 auto-pan 的 12 音符循环),还加了一个正弦 kick 模拟鼓点。最终输出立体声 PCM 数据,总时长 12 秒,AudioStreamWAV.loop_mode 自动循环。
Boss 模式不是独立音符数组——同一个 _bgm_stream,Boss 战通过 pitch_scale = 1.18 加速播放 + volume_db = -3.5 调整音量,听感自然变紧张:
1 | func play_bgm() -> void: |
游戏中音效调用点分布广泛,覆盖了所有交互场景:
graph LR
A["player / combat_controller"] -->|"play_shoot"| S["SFX 单例"]
B["enemy"] -->|"play_enemy_death"| S
C["elite"] -->|"play_explosion"| S
D["boss"] -->|"play_explosion"| S
E["asteroid"] -->|"play_explosion"| S
F["game_state"] -->|"play_player_hurt"| S
G["game_state"] -->|"play_ui_confirm"| S
H["main"] -->|"play_bgm"| B["BGM 单例"]
I["main"] -->|"play_boss_bgm"| B
为什么不用音频文件?
- 零依赖:不需要找素材、处理版权、管理资源文件
- 体积极小:APK 不用打包任何音频资源
- 参数可调:想让射击音更高?改一个频率数值的事
- 学习成本低:不需要音频编辑器,不需要理解音频格式
局限与适用场景
程序化音效的表现力有限——没有混响、没有和声、没有复杂的音色层次。但对于复古风格的弹幕游戏来说,这种”干净的电子感”恰好是风格的一部分。
适合用程序化音效的场景:
- Game Jam / 原型验证阶段,不想花时间找素材
- 复古 / 像素风格游戏,音效本身就是”低保真”美学
- 嵌入式 / 极小体积要求的项目
不适合的场景:
- 需要沉浸式音效的 3A / 叙事向游戏
- 需要多层混音、空间音频的 VR/AR 项目
- 音效是核心卖点的音乐游戏
最好的工程方案不是最强的,是最适合当前阶段的。