Skip to content

单一全局音量控制所有声音

状态: 🟢 已修复

日期: 2026-07-10 严重程度: 🟠 P2(体验缺陷,当前用户可忍受) 影响范围: frontend/src/core/audio-bus.ts(新建) + perception-balance.ts(脚步声) + env-water.ts(水声) + outfit/audio.ts(音乐) 发现方式: 用户反馈 修复方案: audio-bus.tsAudioBus + AudioChannel(sfx/ambient/music 三组独立 + master gain)


问题描述

联邦只有一个全局音量变量,控制所有声音——脚步声、风声、音乐。

调大,三个一起大。调小,三个一起小。

用户反馈:脚步声太大时,风声和音乐也跟着变。但用户只想调脚步声,不想影响其他声音。

根因分析

audio.ts 里只有一个 volume 数字。所有音效都直接乘以这个数字再输出。

这是最简单的设计——只有一种声音时,一个变量就够了。但联邦的声音有三种:

  • 角色走路时的脚步声(sfx)
  • 环境里的风声和水声(ambient)
  • 背景音乐(music)

它们应该各自有各自的音量,然后合在一起,交给一个总开关。

但代码里没有这个结构。只有一个数字。

为什么没有暴露

联邦的声音功能长期以"能播放"为标准。能播放就够了——音量大小、独立控制,被认为是"细节优化",不是 bug。

但"细节优化"和用户反馈之间的距离,只有一次点击。

修复方案

新建 src/core/audio-bus.tsAudioBus 类 + AudioChannel 类。

每个 AudioChannel 内部是一个 GainNode(Web Audio API 的音量节点)。所有音效通过它输出到扬声器。

三个组(sfx/ambient/music)各自独立,组之上有一个 master gain。调组,只影响该组。调 master,所有组一起变。

脚步声归 sfx,风声归 ambient,音乐归 music。

教训

  1. "能播放"不等于"能用好" — 能播放是底线,能控制是体验
  2. 单一变量的设计,在需求增长时最先崩塌 — 一个音量变量服务于一种声音是合理的,服务于三种声音就是漏洞