查看原文
其他

FPS游戏中枪械模块的音频设计思路

谢玮 Audiokinetic官方 2022-03-22

大家好,我是JYUN,近期作为音频设计师参与开发了一款FPS端游,梳理了一些开发过程中碰到的设计点,希望和同行老师朋友分享交流。文本内容基于个人经验和理解,仅供参考。

本文共分为4个模块,分别是:

  1. 枪声素材的混音(Mixing of Gunshot SFX)

  2. 枪声的播放逻辑(Playback logic of Gunshot sounds)

  3. 子弹破风的播放逻辑(Playback logic of Bullet Flyby sounds)

  4. 子弹碰撞的设计思路(How to do Bullet Impact sounds)



模块1:枪声素材的混音(Mixing of Gunshot SFX)


第一人称游戏中包含很多不同的声音:各类语音、3d音效、氛围以及音乐等。确保关键声音在游戏中能被玩家听清,是音频设计师的核心任务(之一)。对于FPS游戏而言,枪声就是关键声音(之一)。

枪声是非常有特质的音效:由于爆破声的存在,音头较大,容易触发中间件的总线压缩的同时,也容易触发(易被玩家听见的)中间件的空间混响。而游戏的Headroom不是无限的,如果枪声素材在混音这一环节没有做好,在游戏中就会过多地触发母线压缩或压限,导致音头缺乏力度和打击感,俗称的“糊”或“扁”。

制作枪声的方法,有很多老师提过,这里就不赘述了。我的经验是,想要在音频引擎中更好地播放,最好把枪声作为one shot素材文件导出,这样可以更好地控制声音表现,同时也节省性能(当然,针对某些特定的设计,拆分音效分层配置于Wwise中播放也是必要技巧,但并非本文的重点讨论对象)。

这里提两个步骤,可以帮助枪声在游戏中争取到更多的清晰度和响度。


1. 避免音效中包含过度凹陷的频段


于大部分玩家而言,听音环境并不像专业监听环境那么“全频”,这样“非全频”的听音环境会造成音频设计师的设计思路不能很好地传达。举个例子:

我制作了音效A。音效A在1khz~2khz有频段凹陷,但由于其他频段比较丰满,所以我没有太在意凹陷的频段。在某台手机的喇叭上播放时,由于这个喇叭的其他频段的表现都很弱,但1khz~2khz的表现尤为突出,那么音效A在这个喇叭上的响度就会比别的音效更低。

如果你的枪声刚好和音效A有同样问题,那么在这台手机上,这个枪声会容易被其他声音给掩盖掉。

最直接的解决方法是给音效A增加1khz~2khz的声音素材,或用均衡器解决。但最重要的是意识到问题的存在,用Fabfilter Q3的频谱仪可以方便地监测出问题。

可见,只要监测出音效中存在过度凹陷的频点,修复的方式是不唯一的。针对频点凹陷的问题,还可以使用多段饱和器(如Fabfilter Saturn 2或Steinberg QuadraFuzz)来解决,此处不赘述。 


2. 控制音效电平峰值


枪声这种大音头的音效,通常会作为侧链源,来压缩别的音效(或音乐)。但播放数多起来之后,枪声的大音头依然容易触发中间件的母线压缩和压限,导致枪声变糊。所以我们需要一个工具来控制音头,争取更多的Headroom,却不改变整体音色。


最直接有效的方式是使用削波器,这里推荐的削波器是Submission Flatline。



可见,削波器在一定程度上,可以保证素材音色的纯净,同时控制峰值。但不同削波器有不同的生成谐波的行为,实际使用时还需具体情况具体分析。



模块2:枪声的播放逻辑(Playback logic of Gunshot sounds)


射击游戏的战斗系统通常都是围绕枪支弹药展开,如何将琳琅满目、种类繁多的枪械表现好,是音频设计的重心。


尽管在同一个射击游戏中,可能包含着差异性巨大的不同武器,但总结下来会发现,游戏中包含的武器,都是以几种不同类型的现实原型来展开设计(原型包括但不限于:手枪(Pistol)、突击步枪(AR)、狙击步枪(SR)、霰弹枪(SG)、冲锋枪(SMG)和喷射器等)。

其中手枪、狙击枪和霰弹枪的音效,大都是One Shot播放。真正需要动脑筋的是连发、全自动和循环型音效。根据项目的需求,枪声播放逻辑的复杂性天花板非常高。

以前有老师讲解过如何在中间件中配置枪声,其中提到将资源渲染成包含多次枪声的长文件,用音乐轨播放,适用于全自动射击的枪械。这个方法很巧妙,但由于我参与的项目有实时变化射速的需求,所以只能另辟蹊径。以下是我的思路:


类型1:连发模式(Burst Mode)


对于某些AR或SMG的连发型点射,可采用序列容器嵌套随机容器的方式:


如上图,在序列容器内嵌套若干个随机容器(此处范例为3),在随机容器中配置枪声多样本(相邻播放的两次随机容器中的多样本最好不同)。

随后,在序列容器的Playlist中,配置播放数量及顺序(该武器设定为3连发。则配置数量=3):

然后在序列容器中配置play mode。此处希望每次触发事件都触发一次3连发,所以选择Continuous,即每次触发事件,该序列容器的playlist都会依次播放完。随后勾选Transitions,类型选择为Trigger rate,Duration则根据武器设定的射速来设置(该武器设定的射击间隔为67ms,则输入0.067)。

最后在每个随机容器都挂上pitch随机化,并且保证每个声音开始的位置都在音头上(全自动模式同),就可以预览效果了:




类型2:全自动模式(Full-Auto Mode)


为了满足“射速能实时变化”的需求,这里提供如下思路:

使用随机容器装载枪声文件(如上图),Play Mode选择Continuous,并勾选Loop,在Transitions下方的Duration填写武器的基础射速(此处为100ms,下图):

接着使用2个事件来控制射击的启/停(当玩家射击时调用play event,当玩家停止射击时调用stop event,参考下图)。Stop event需要写上Fade Time防止鬼畜,为了能够及时停止,建议写100ms以下的值(此处为50ms):

随后,配置一条rtpc,用于控制射速(下图):

(如上图)这里的rtpc取值为(0,2),其中1为原始射速(Y=0);0为最慢射速(Y=31ms,意为射击间隔增加31ms);2为最快射速(Y=-19ms,意为射击间隔减少19ms)。

配好后预览效果:



类型3:喷射型武器


这个类型应用于镭射枪和喷火器等枪械,这类武器的共同点在于发射瞬间都会有强音头,音头过后则为Loop型的喷射/照射音效,所以这里选择的是混合容器嵌套的思路:

其中shot文件为射击音头,loop1和loop2为持续的喷射/照射音效,使用多个loop文件是为了降低玩家听出循环点的概率,所以loop1和loop2最好为不同长度的音频文件。随后在loop1和loop2容器上勾选循环:

和类型2:全自动模式一样,使用两个event分别控制武器射击的启/停。效果如下:




模块3:子弹破风的播放逻辑(Playback logic of Bullet Flyby sounds)


子弹破风音效,是射击游戏中紧张感的来源之一,也是刻画战场的重要因素,可以说是沉浸感的必要条件。


子弹破风音效可用于回调美术特效,以确保声画的一致性。但由于我参与的项目,子弹飞行速度较慢,所以最终选择了另一个思路来实现这个功能:


假设图中蓝色人体模型为第一人称游戏的玩家模型(Camera以及Listener应该配置在这个人体模型的头上),绿色为游戏引擎中的球状碰撞体,将其以Listener为圆心来配置(圆的直径根据游戏所需收听的子弹范围来决定),结果如下:

之后需要为游戏中的子弹配置可触发碰撞的Game Object。当子弹碰撞Listener周围的球状体时,就调用Bullet Flyby的事件。同时,子弹的入射角会反馈角度信息,来控制Wwise中的转换容器。

接下来,展开讲Wwise的配置方式:

如上图,子弹碰撞球状体后触发转换容器,其下有9个子随机容器,分别对应9种不同的子弹入射情况。上图第一种为子弹击中玩家(需要配置stop event来及时停止声音),其余八种情况为子弹不同的入射角,分别是:

  1. Listener的左前方→左后方

  2. Listener的左前方→右后方

  3. 依此类推

与其配套的switch的设置如下:

下一步,则是配置不同方向的声音轨迹,拿left_front_to_left_rear容器作举例:

在3D Position这里选择Listener with Automation,来给声音画上定位轨迹(如上图):轨迹为从左前方到左后方。这个功能还可以画数个方向相同但角度或时长等略有不同的轨迹,再选用随机化,这里就不赘述了。

点击Configure Timeline给这个轨迹配置时间轴(意为该音效从初始位置到达终点位置的过程所需的时间,该时间需要配合资源的ADSR来设置,经测试在150ms~400ms之间为佳)。

最后,回到母转换容器上,配置3D衰减曲线:

展示效果:



模块4:子弹碰撞的设计思路(How to do Bullet Impact sounds)


读者朋友如果完整地看到这里的话,会发现你已经不关注子弹碰撞音效的播放逻辑了,因为和上文的逻辑是大同小异的。需要注意的是,上文提到的Gunshot是2D播放的,而Bullet Flyby是“伪3D”播放,但子弹碰撞则需要“真3D”播放(读取游戏引擎的定位信息,来渲染子弹碰撞音效的定位效果)。

这里主要分享子弹碰撞的设计思路。通常在射击游戏中,和“子弹碰撞”这一行为相关的音效常有4种:

  1. 奖励音效:如命中敌人弱点的奖励音效(典型案例为《守望先锋》的爆头奖励音效),击杀敌人的奖励音效等;

  2. 子弹击中音效:通常是子弹命中后的碰撞和轨迹引发的声音,如跳弹、摩擦、碰撞甚至爆炸等拟声。可配置在子弹Game Object上,碰撞即触发;

  3. 物件受击音效:通常是物件被子弹击中后引发的声音,如玻璃破碎,水面因射击而扬起水花等拟声,甚至是敌人的受击和死亡音效等。可配置在物件Game Object或用美术特效回调;

  4. 伤害确认音效:和奖励音效类似,有提示作用,但通常程度较低,如击中敌人躯干,击破敌人护盾等。

根据游戏设定的不同,以上4类音效的播放逻辑或有变化。基于我的项目经验,奖励音效都为2D播放,其他3种则为3D播放。为了让这些音效能够清晰地表现,需要梳理它们的优先级,并配置相应的动态混音。

先假设如下场景:你是玩家A,而队友B命中了敌人C并成功击杀,因为击杀行为不是A控制的,所以无须对A播放奖励音效,只播放C的死亡音效和B的子弹击中音效即可,此处C的死亡音效优先级更高,应该是没有争议的;但如果玩家A命中了敌人C,触发了破盾效果,并成功击杀,此时播放了【A的奖励音效+C的破盾音效+C的死亡音效】,我们就要做出选择:应该让玩家优先关注哪个声音?

通常来说,奖励音效>死亡音效>破盾音效。

根据游戏中可能发生的情况做穷举,可大致得出一个基本思路:

奖励音效>部分子弹击中音效(如爆炸等)>部分伤害确认音效(如敌人死亡等)≥部分物件受击音效(如击中油桶爆炸)>大部分伤害确认音效(如命中躯干)=大部分子弹击中音效(如跳弹)>大部分物件受击音效

基于游戏中还可能存在贯通型或AOE型子弹,这个列表越清晰,越利于在Wwise层面将声音处理得干净和清晰。

基于以上思路,可以设置动态混音,首先先为各个层级配置好母线(下图):

在gunshot_feedback的管线下,放置3个大层级(t1、t2和t3)。在3个层级下又细分6个层级,分别对应:

t1_damage_bonus=奖励音效

t21_sfx_bullet_explode=部分子弹击中音效(如爆炸等)

t22_sfx_damage_confirm=部分伤害确认音效(如敌人死亡等)

t23_sfx_prop_explode=部分物件受击音效(如击中油桶爆炸)

t31_sfx_bullet_feeback=大部分伤害确认音效(如命中躯干)+大部分子弹击中音效(如跳弹)

t32_sfx_prop_damage=大部分物件受击音效

接下来把相关的音效容器,送进相应的母线后,就可以开始设置动态混音了。首先是奖励音效的避让,因为这部分都是2d音效,可以用HDR和auto-duck。基于以上的管线构造,我选择了auto-duck(下图):

在t2和t3上都做相同的设置。基于t1通常都是清脆大音头的音效,所以Fade In设置得比较短(100ms)。接下来,是给t2和t3做metering侧链。首先设置rtpc:

在t21上加载meter插件,将读数发送到t22的rtpc上:

然后在t22和t23上配置rtpc(如下):

同样的metering侧链方式,也应用于t2压t3、t31压t32。如此设置,便完成了如下优先级的梯度设定:

奖励音效>部分子弹击中音效(如爆炸等)>部分伤害确认音效(如敌人死亡等)≥部分物件受击音效(如击中油桶爆炸)>大部分伤害确认音效(如命中躯干)=大部分子弹击中音效(如跳弹)>大部分物件受击音效

当然,声音的优先度,不仅需要通过动态混音来控制,也需要在素材层面进行把控,甚至需要用到Wwise的播放优先级(Playback Priority)来控制。通过控制响度差异和频响避让,也能做出很好的效果,此前有老师分享过侧链低切和侧链特定频段的控制方式,使用Wwise自带的插件已经能做出非常清晰的动态混音。


总结


游戏的研发过程会有很多不可预见的变数,根据不同项目的玩法重心、操作特点和及世界观设定的差异,音频设计的重心也有所不同。


本文基于个人的项目经验及对声音设计的理解,讨论了FPS游戏中几个音效模块的设计思路。一家之言,姑妄论之,不足为训,旨在抛砖引玉,如果对读者有些许帮助,实属我的荣幸。

Wwise的存在使我的很多思路能够落地,未来我也会更深入地学习音频设计的技术和艺术,也希望有更多机会和同行老师朋友多做交流。



本文作者


谢玮

灵犀互娱,游戏声音设计。热爱游戏、影视、动漫和音乐,Progressive Fusion和Djent爱好者。致力于“恰到好处、不偏不倚”的声音设计。




往期推荐



Wwise 中针对 Spatial Audio 所作的改进 – 第 3 部分:后期混响


Wwise 中针对 Spatial Audio 所作的改进 – 第 2 部分:衍射


Wwise 中针对 Spatial Audio 所作的改进 – 第 1 部分:距离建模和早期反射



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存