精选的想法、故事和创意,全部汇集于此!

文章背景图

终末地的音频系统:4张嘴说话却不打架

2026-08-17
5
-
- 分钟

直接把音频拖进场景,不是工业化做法

把声音文件拖进关卡,在角色代码里加一段播放逻辑,角色跳跃时就能出声。做法简单,但大型 3A 不这么干。工业化程度高的游戏会搭一整套专业音频系统和管线,角色说一句话,中间要经过很多额外工序,有时还要借助 Wwise 这类第三方中间件。

鹰角在 Wwise 官方博客分享了一篇技术文章,讲终末地怎么搭建模块化音频系统。通过分层设计、解耦,把音频逻辑和游戏逻辑分开。

收音位置挂在摄像机上,远镜头就听不清

终末地和很多游戏一样,收音位置挂在当前正在工作的摄像机上,玩家听到的声音和看到的画面匹配,摄像机离发声源越近声音越大。所以镜头从远景切到角色特写时,能听到他挥手的声音;正反打过程中,瀑布声在左右声道间来回切换——都说明收音位置跟着镜头走。

按这个逻辑,镜头离角色很远时,应该听不清角色说话。但终末地的对话场景里,镜头离角色很远,语音依然清晰。是因为制作组给发声体设计了自适应衰减函数:针对不同相机 FOV 和焦距自动调整声音增减,同时计算每个发声体在屏幕内的占比,自适应控制声音细节。长焦下收音位置离角色再远,听感也能和画面匹配。

声音指导

麦克风挂在摄像机上还有另一个问题:剧情突然闪回或切镜,画面到了另一个环境,声音跟着突变,出现断档或空间感错乱。

终末地在收音系统里加了 Listener Manager(声音指导)模块。声音指导根据当前游戏中发生的情况,自行判断计算麦克风应该在的位置。麦克风像个专业收音师,内置各种平滑移动函数,能用各种方式运动到目标点,但游戏里发生什么跟它无关——声音指导让它去哪,它就去哪收音。

场景切换时,收音师不会跟着摄像机瞬移,因为它根本不知道摄像机是什么。声音指导发现画面切换后,再让收音师移动到新场景,听到的声音是平滑过渡的,不是突然变的。

为什么要拆成两个人?这是解耦思维。雇一个全职保姆负责买菜做饭打扫,买菜的人进了医院,当天就没人做饭打扫。把工作分开,采购员、厨师、保洁各管一摊,即使没人买菜,保洁还能干活。游戏逻辑代码牵一发而动全身,修改一个功能可能引发一串问题,解耦能尽量减少这种影响。收音指导和收音师逻辑完全分开,不管怎么改收音师的代码,甚至换一个新收音师,都不影响收音指导运行。

分层语音管理

终末地角色会根据游戏里发生的事做语音反馈,发现道具、发现强敌、采集素材、受伤、放技能各有不同语音。小队作战四名队友同时在场上,语音很容易相互重叠。角色控制权在玩家手里,很多行为无法预测,玩家可能在角色受伤的同时放连携技。但终末地里,不管玩家怎么操作,语音从来不重复、不重叠。

直接把播放逻辑接在行为后面会导致每次跳跃都说同一句话,每个角色各说各的,事件一多就会混乱。终末地做了套分层语音管理系统,把"事件触发到发出声音"分成四级:

全局触发层:判断由谁做什么反应,决定由哪个角色对采矿做出反应,负责分配工作。

响应层:在指定角色的语音列表里找对应反应条目,找到音频编号。

语音通道层:收集所有响应层传来的编号,排出播放列表。

语音播放层:播放。

每一层还有具体判定规则:

触发层设定选人规则:从队友里随机挑一个,或按活跃度挑。

响应层发现同类事件还在 CD 中,放弃多余请求——短时间连续触发几次反应事件,第二次采矿语音会由另一个队友来说,不会连着触发同一句。

语音通道层判定优先级:战斗语音高于采矿语音。角色正在说采矿语音时进入战斗,战斗语音直接打断;战斗过程中打碎矿,直接放弃采矿语音。

靠这些规则层层筛选,避免一个事件发生时每个角色都反应,也避免同一个角色反复做单一反应。终末地里每一句语音都不是随便播的,经过层层把控,才是玩家听到的始终不重叠、不重复的语音。分层让各层彼此不直接依赖,改起来灵活。

环境音效

传统环境音效把音频直接挂到发声源上,瀑布就放个喇叭播瀑布声。实际开发中问题不少:音频设计师和关卡设计师同时编辑一张地图会互相打架;音频直接放场景里,关卡加载时会和其他资产一起进内存。终末地环境音很细,每个小区域都有不同环境声,加上各种虫鸣鸟叫的 3D 音效,全加载进内存性能压力大。

所以终末地的音效不放游戏场景里,而是放在独立的音频场景中。把游戏场景看作一幅画,音频场景就像铺在画上的一层临摹纸,设计者对照场景位置在上面放音频,不直接影响原稿。

音效师放的也不是真的音频播放器,是一种叫 Quater 的替身,只存在于编辑器里,不会被带进游戏。打包时系统把所有 Quater 信息压榨出来,存成极小的二进制文件;玩家游玩时读取二进制数据,实时把音频还原到设计师设定的位置和状态。播放时只需要串流加载玩家周围的环境音效,降低性能消耗。

另外还用了 Wwise 的 Auto Define It (SBX) 技术,不用在关卡加载时把全部音频塞进内存,用到哪个再加载哪个。 终末地的工程里合计存在超过 15 万个声音对象,移动平台上游戏音频内存占用能压到 50MB 以下。

针对性优化

很难靠一种方法解决所有优化问题,有些地方得单独处理。某个角色副本里有大量可逐根交互的激光阵列,本质是大量线声源,逐根计算每帧可能要算几百个发声体。

制作组利用多层音效系统的灵活性,临时加了个辅助模块:主线程不再逐根算激光音效,把计算分配给其他闲置 CPU 核心,自己接着算游戏逻辑,充分利用多核、减少卡顿。这个模块只对特定场景生效,不影响游戏其他部分;以后加新系统,只需新增辅助模块,不用改核心音频系统。

这个案例说明分层设计的价值:核心系统保持稳定,特殊需求用辅助模块解决,不会牵一发而动全身。终末地要长期运营和更新,把音频逻辑和游戏逻辑完全分隔开,写游戏逻辑的程序员不用自己碰音频,音频设计师也不用担心影响游戏运行,不同岗位各干各的还能高效协作。


参考文献

原创

终末地的音频系统:4张嘴说话却不打架

本文链接: 终末地的音频系统:4张嘴说话却不打架

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录