Appearance
单一全局音量控制所有声音
状态: 🟢 已修复
日期: 2026-07-10 严重程度: 🟠 P2(体验缺陷,当前用户可忍受) 影响范围: frontend/src/core/audio-bus.ts(新建) + perception-balance.ts(脚步声) + env-water.ts(水声) + outfit/audio.ts(音乐) 发现方式: 用户反馈 修复方案: audio-bus.ts → AudioBus + AudioChannel(sfx/ambient/music 三组独立 + master gain)
问题描述
联邦只有一个全局音量变量,控制所有声音——脚步声、风声、音乐。
调大,三个一起大。调小,三个一起小。
用户反馈:脚步声太大时,风声和音乐也跟着变。但用户只想调脚步声,不想影响其他声音。
根因分析
audio.ts 里只有一个 volume 数字。所有音效都直接乘以这个数字再输出。
这是最简单的设计——只有一种声音时,一个变量就够了。但联邦的声音有三种:
- 角色走路时的脚步声(sfx)
- 环境里的风声和水声(ambient)
- 背景音乐(music)
它们应该各自有各自的音量,然后合在一起,交给一个总开关。
但代码里没有这个结构。只有一个数字。
为什么没有暴露
联邦的声音功能长期以"能播放"为标准。能播放就够了——音量大小、独立控制,被认为是"细节优化",不是 bug。
但"细节优化"和用户反馈之间的距离,只有一次点击。
修复方案
新建 src/core/audio-bus.ts:AudioBus 类 + AudioChannel 类。
每个 AudioChannel 内部是一个 GainNode(Web Audio API 的音量节点)。所有音效通过它输出到扬声器。
三个组(sfx/ambient/music)各自独立,组之上有一个 master gain。调组,只影响该组。调 master,所有组一起变。
脚步声归 sfx,风声归 ambient,音乐归 music。
教训
- "能播放"不等于"能用好" — 能播放是底线,能控制是体验
- 单一变量的设计,在需求增长时最先崩塌 — 一个音量变量服务于一种声音是合理的,服务于三种声音就是漏洞