参考 06:中间件集成与总线架构
1. 中间件选型
|
Wwise |
FMOD |
原生(Unity Audio / Unreal MetaSounds) |
| 定位 |
大/中型项目行业标准 |
中小项目、独立团队 |
极简项目 / 无预算 |
| 强项 |
强大的混音、Profiler、动态音乐、平台支持、多人协作 |
上手快、轻量、免费额度友好、Studio API 灵活 |
零依赖、无额外成本 |
| 弱项 |
学习曲线陡、授权费用(超预算门槛) |
大型工程组织能力弱于 Wwise |
几乎无专业混音与动态音乐能力 |
| 典型用户 |
3A、主机/多平台 |
独立、手游、PC 独游 |
原型、超休闲 |
| 建议 |
主机/3A/长期项目首选 |
独立/移动端/快速迭代首选 |
仅原型阶段 |
2. 通用概念映射(跨中间件)
| 概念 |
Wwise |
FMOD |
Unity |
Unreal |
| 播放触发 |
Event |
Event |
AudioSource.Play |
Play Sound / MetaSound |
| 分类层级 |
Actor-Mixer Hierarchy |
无(用 Bus + 参数) |
Mixer Group |
Sound Class / Submix |
| 混音总线 |
Bus (Master-Mixer) |
Bus / Group |
Audio Mixer Group |
Sound Submix |
| 辅助/发送 |
Auxiliary Bus |
Return Bus |
Send / Return |
Submix Send |
| 连续参数 |
RTPC |
Parameter |
Exposed Parameter |
Audio Parameter |
| 离散切换 |
Switch |
Parameter (labeled) |
手写逻辑 |
Enum Parameter |
| 全局状态 |
State |
Global Parameter |
手写逻辑 |
Gameplay Tag / State |
| 混音快照 |
Snapshot |
Snapshot |
Snapshot |
Submix Preset |
| 混响区 |
Reverb Zone / Environment |
Reverb(3D 属性) |
Audio Reverb Zone |
Reverb Effect / Submix |
| 打包 |
SoundBank |
Bank |
Addressables |
Chunk / Primary Asset |
3. 推荐总线架构(可直接套用)
Master_Mixer (Limiter: -1 dBTP, 输出 -23 LUFS)
│
├── BUS_Music [ducking: 被 VO 压 -6dB]
│ ├── BUS_Music_Exploration
│ ├── BUS_Music_Combat
│ └── BUS_Music_Stinger
│
├── BUS_SFX [HPF 40Hz]
│ ├── BUS_SFX_Weapons (优先级 80, voice limit 16)
│ ├── BUS_SFX_Character (优先级 70, voice limit 12)
│ ├── BUS_SFX_Impacts (优先级 65, voice limit 12)
│ ├── BUS_SFX_Vehicle (优先级 75, voice limit 4)
│ └── BUS_SFX_AmbientDetail (优先级 30, voice limit 8)
│
├── BUS_UI [不进混响, 优先级 90, bypass 3D]
│
├── BUS_Ambience [ducking: 被 VO 压 -4dB]
│ ├── BUS_Ambience_Exterior
│ └── BUS_Ambience_Interior
│
├── BUS_Voice [优先级 100, 最高; Compressor 3:1 + De-esser]
│
└── BUS_Cinematic [过场专用,可临时 duck 其他全部]
Auxiliary (Send targets):
├── AUX_Reverb_Short (0.8–1.2s, 室内小房间)
├── AUX_Reverb_Long (2.5–4.0s, 大厅/洞窟/室外峡谷)
├── AUX_Delay (回声, 山谷/废墟)
└── AUX_Underwater (LPF 500Hz + 强混响, 特殊状态)
总线设置要点
- 优先级数字越大越优先(Wwise 中 Priority 是"值越大越不容易被裁掉",注意各中间件定义相反,务必确认)
- Voice Limit 必须按类设置:同类音效超过限制时按优先级 + 距离裁掉
- UI 与 VO 不要 Send 到混响(会变糊)
- Cinematic Bus 只用于过场,避免过场音乐与 gameplay 音乐打架
- 每个子总线挂 HPF 40–80Hz 清理无用低频,能显著减少浑浊并省 CPU
4. 混音快照(Snapshot / State-based Mixing)
| 场景 |
处理 |
| 暂停菜单 |
Music -8dB + LPF 2kHz;SFX -12dB;UI 保持 |
| 水下 |
全局 LPF 500Hz;Reverb Send +6dB;Music -6dB |
| 慢动作 / Bullet-time |
Music -6dB + 变调 down pitch;SFX LPF 3kHz;加低频轰鸣 |
| 死亡 |
Music fade out(2s);Ambience -10dB + LPF;心跳低频 solo |
| 剧情对话 |
Music -8dB;Ambience -5dB;SFX -6dB;VO -0 |
Snapshot 过渡:用插值时间(200–500ms),避免突兀跳变。
5. Voice 管理(性能关键)
总 Voice 上限:主机 128 / PC 96 / 移动 32
↓ 超出后的策略(按顺序)
1. Priority 最低者先停止(Kill)
2. 音量低于阈值(如 -60dB)者 → Virtual Voice(后台计算,恢复时可接续)
3. 距离超过 Max Distance → 停止或虚拟化
4. 同类超限 → 用 "Use Exclusive / Voice Stealing" 抢占
Virtual Voice 三种行为(Wwise):
Play from beginning — 恢复时重头播(脚步,OK)
Play from elapsed time — 恢复时接着播(引擎,OK)
Resume — 保持位置(循环环境音,OK)
Kill if finite else virtual — 一次性音直接砍(推荐默认)
6. 集成接口文档模板(events.md)
事件表
| Event 名 |
触发时机 |
3D 位置 |
循环 |
Stop 事件 |
备注 |
Play_Weapon_Rifle_Fire |
开火瞬间 |
枪口 Socket |
否 |
— |
带 Switch_Material |
Play_Vehicle_Engine |
上车 |
车辆 |
是 |
Stop_Vehicle_Engine |
必须成对 |
Play_UI_Menu_Hover |
悬停 |
2D |
否 |
— |
BUS_UI |
RTPC 表
| RTPC |
范围 |
驱动源 |
更新频率 |
影响 |
RTPC_Vehicle_Speed |
0–200 |
车速 km/h |
每帧 |
引擎音高 + 音量 + 风噪 |
RTPC_Player_Health |
0–100 |
血量 |
变化时 |
心跳强度、听觉低通 |
RTPC_Occlusion |
0–1 |
射线检测 |
10Hz(插值) |
LPF 截止 + 音量 |
Switch / State 表
| 名称 |
类型 |
取值 |
设置者 |
默认 |
Switch_Surface |
Switch |
Dirt / Stone / Metal / Water / Grass |
物理材质 |
Dirt |
State_Combat |
State |
Exploration / Combat / Stealth |
GameMode |
Exploration |
State_Location |
State |
Interior / Exterior / Cave |
触发器 |
Exterior |
7. 打包与加载策略
- SoundBank 分包原则:按
通用(常驻) / 按关卡 / 按角色 / 按语言 VO 拆分
- 常驻 Bank 控制在 < 15MB(含核心 UI、玩家角色、通用反馈音)
- VO Bank 按语言独立,切换语言时卸载旧包再加载新包
- 关卡切换用 异步加载 + 音频淡入,避免加载卡顿
- 移动端:Bank 用 Opus/ADPCM,避免一次性解压大包
8. 常见集成事故清单
- ❌ 循环音 Start 了没有 Stop → 切场景后声音叠加(头号 bug)
- ❌ 物体销毁时未发 Stop → 悬空声源持续播放
- ❌ 在构造函数中 Post Event → 音频系统未初始化,事件丢失
- ❌ 3D 音未绑定位置更新 → 声音固定在原点
- ❌ 每帧 Post Event(无节流/无状态判断)→ voice 数爆炸
- ❌ UI 音挂在 3D 总线上 → 玩家移动时音量忽大忽小
- ❌ 多语言 VO Bank 全部常驻 → 内存爆
- ❌ 未设置 Max Distance → 全图所有音源都发声,CPU 爆