使用Unity5开发手游,使用FMOD或wwise音频插件而不是自带的声音系统有哪些好处?

https://www.zhihu.com/question/61882604

碰巧对Unity里的声音脚本,FMOD和Wwise都比较了解,强答一下。音乐和音效还得分开说,因为这两个很多时候需求和设计很不一样。

首先,简单的2D游戏大部分时候是用不到这两个中间件的,除非是音乐游戏。而3D游戏尤其是第一人称视角的游戏中就比较有必要。中间件最强大的地方在于自带的那些效果器,用于3D音效的空间处理,这点在沉浸式体验的游戏中非常重要。FMOD和Wwise中带有各种DSP的实时运算处理插件,用于声音在真实场景中的渲染,而Unity引擎中除了加一个Low/High Pass Filter和非常基本的Reverb之外几乎没有任何可以控制的地方。FMOD拥有天气环境音效的生成器,Wwise还带有一些物理建模的插件来模拟挥舞声、风声和击打声等,可以为游戏节省一些资源空间。如果要做AR/VR的游戏,就更加需要中间件进行空间化处理了。据说Wwise现在在开发智能分配通道的功能,也就是说不管玩家的播放设备是什么样的,单声道/立体声/5.1环绕声/VR也好,都能将当前声音在声场中的位置自动分配相应的音量到每个通道上。

在音效上,最让程序员头疼的就是资源管理。音效师做出来的资源往往只有自己才能数的清,程序员在不进行大量沟通的情况下很难理解每个子文件夹都是做什么的,这点对于大公司的开发团队尤甚。举个例子,当我需要做某个怪物的脚步声的时候,哪怕是最简单的随机选取不重复机制,如果在Unity里直接写,都需要先把某个精确路径下的文件载入到一个AudioClip[]里,然后随机选取再检测确认与上一个不重复。还需要考虑一个AudioSource同时只能播放一个AudioClip,如果声音的尾巴比较长的话,会打断,所以可能还得放多个AudioSource,或者根据之前的脚步声有没有播放完来决定是否Instantiate另一个AudioSource然后等到播放完再Destroy。这些在程序上实现并不难,但是很烦人,也可能会产生bug。不像动作特效上的bug一眼就能看出来,程序不懂音频技术还不一定听得出音频上的bug,最后给项目开发带来很多额外的工作量,影响开发效率。而且,我就没见过几个程序员戴着耳机工作的。

还是脚步声的例子,如果我要做出不同的怪物在不同的地面上发出不同的脚步声,以上工作量就大得多。但是如果使用中间件,尤其是Wwise的话,程序员只要做一个简单的Raycast然后把结果对应相应名字的Event就行了,几十行的代码简化成了一行。所有的这些随机/避免重复/不同怪物/不同地面/voice数量等等都不需要程序员来考虑,交给音频设计师在中间件里完成就行了。中间件对于音效带来的另一个好处是能够对不同声音事件进行优先级判断,砍掉不重要的声音或者音量太小的声音,提高游戏性能优化。这个在Unity里虽然也可以做到一些基本的,但可控性比较弱。

另外就是声音的动态变化。Unity居然不支持最简单的声音淡入淡出,需要专门去写一个Coroutine。比如赛车游戏中引擎的声音,往往有很多个样本文件,在不同转速下进行cross fade。在Unity里面要实现这个无缝渐变是比较困难的,但是在中间件里,只需要程序员把引擎转速的变量与FMOD中的parameter或者Wwise中的RTPC在Update里面进行赋值对接就行了。

还有一点就是对于资源包的管理。不管是配乐还是音效,导出的原始文件都是wav格式,占用大量体积。而FMOD和Wwise里都可以针对不同的平台进行不同格式以及大小的压缩。Wwise甚至能够对每一个音频文件自动检测可承受的压缩范围,以保证资源包的最小化,这点在手游上尤为重要。在游戏运行过程中,中间件也可以选择针对不同的音频进行不同的预处理,如常触发并需要快速反应的音效就载入内存中,音乐和环境声就从磁盘上stream,这一点优化是Unity做不到的。不管是FMOD还是Wwise,都能够跟Unity直接连接,通过Profiler来实时查看音频部分在游戏中CPU与内存的消耗,以便进行更好的优化。音频设计师也能够更方便的测试自己做出来的声音在游戏里不同情况下的播放究竟是什么效果。

说完了音效来说音乐。如果只是播放一个BGM的loop,是用不到中间件的,但是现在讲究点质量的游戏都会进行动态音乐或者互动音乐的设计,而这一点在Unity里是没有任何技术支持的。我曾经自己用C#写过动态音乐判定的播放规则,包括分层播放以及段落转接。虽然不是非常复杂,但毕竟音乐和程序都是我自己写的,不会有沟通理解上的困难。在大多数现实情况中,程序员不懂音乐,音乐人也不懂程序,如果不用中间件,很难完美地完成音乐人想要的播放效果。

在手游上,尤其是休闲游戏中,许多音效是音乐化的,这就在触发时间上有了要求,我们叫做stinger。比如玩家在吃掉一个物品获得技能时,在音乐中插播一小段旋律或者鼓点。在Unity中无法做到让这些stinger卡在节拍上,除非专门去算每首音乐的节拍换算成每一拍的毫秒单位,然后加一个计时器进行除余(程序员听到这么复杂的需求很可能就觉得算了懒得弄)。

更复杂的是音乐段落之间的对接。音乐文件往往要留着最后的尾巴,因此时长比实际音乐的时间长。如果不留有尾巴,就会听到“噗”的一声,音乐好像突然被切掉了。在音乐之间切换的时候,如果不用中间件,程序员必须知道实际音乐的精确时间长度,而无法通过简单的AudioSource.isPlaying来判断是否进入下一段音乐。在FMOD和Wwise中,这个问题都可以非常简单地解决。Wwise还带有Pre-entry功能,让音乐开始前的前奏提前播放,达到更加智能的播放效果。

Wwise在音乐上的探索还远不止简单的播放分层/段落等方法。在算法生成音乐上都有了技术上的尝试。音乐人在编曲的时候先写好MIDI音符,再通过MIDI音符触发对应的采样文件来生成音乐。游戏的高互动性决定了这种预先写好的音乐是不够动态的。在Wwise中,能够支持简单的采样器功能,将音符采样导入,然后根据不同的游戏状态播放不同的音符。未来我们很可能会见到旋律永不重复的音乐游戏,就是通过这样的技术来进行音乐的动态生成,只要音乐人提供一个算法并将控制点与游戏中的参数对应。这对于绝大部分游戏而言是用不上的,但是中间件为这样的游戏设计提供了可能。如果在游戏中单独写一套AI作曲系统,开发的难度和工作量可以单独做一个游戏了。

最后,说白了,对于中小规模的手游,使用中间件更大的好处是让本来就不多的程序员从音频部分中解放,只需要负责游戏本身的开发就可以了。本身小制作成本的游戏使用中间件也花不了多少钱,但是为程序员节省了大量的时间来重新造轮子,也让音乐人/音效师对自己制作的东西有更好的把控。对于大型游戏而言,中间件能做到一些Unity本身无法做到的功能,同时在音频的资源管理上省去了很多扯皮的麻烦。

【欢迎关注我的微信公众号:用耳朵玩游戏,分享游戏音频的知识与资讯】

编辑于 2018-06-29

岳豪

游戏音频设计师、技术音频

作为一名游戏音频设计师,这个问题被问到过很多次。几句话很难说清楚,正好趁这个机会写下来。希望越来越少的设计师会被问到这个问题。(FMOD、CRIWARE我都不够熟悉,以下只从Wwise的角度说。)

Wwise里面有很多很炫酷的功能,有些可以增强声音的交互性、有些可以提高声音的表现力、还有些可以提高设计师的工作效率。但是介绍这些功能的时候,往往被程序员一句“手游用不到这个”呛得半天说不出话。

确实,在使用了Wwise的手游项目中,我们也仅仅使用了它很少一部分功能。但其中的一些功能,即使是对于手游来说也是绝对不可缺少的。

1、用Event封装一切

对于Wwise来说,Event不只是一个AudioClip,而是一个或多个Action。这个Action可以是播放、暂停、停止一个SoundObject(一个SoundObject可能是多个wav文件),可以是控制某个声音插件的参数来实现某种复杂的声音效果,还可以是内部封装的某些操作,比如切换混音状态。这些Action有些只需要了解播放逻辑就可以完成,还有些必须了解数字音频技术、效果器处理、混音理论才能够完成。把这些操作全部交给程序员是不现实的。在Event封装之后,程序员只需要在正确的时机调用PostEvent就好,完全不需要了解Event内部究竟发生了什么。

2、音频工作站级别的总线控制

总线(bus)这个概念对于非音频专业出身的人来说可能有点陌生,这里我不打算详细的解释这个概念。我们可以直接从应用的层面来说明为什么总线对声音很重要。

首先,最简单的,我们希望在游戏中,音乐、音效、语音可以分别设置音量大小及开关。借助总线可以非常方便的实现这个功能。当然,即使没有总线,程序实现这个需求也不是非常复杂。

那么,进一步的。在游戏进行的过程中,有时会播放CutScene。很多游戏中,CutScene是通过在游戏摄像机前又盖了一层2D画面实现的。那么这个时候,有一个新的需求。如何让玩家只听到CutScene的声音,而屏蔽掉被CutScene覆盖的游戏画面中正在发出的声音?到这一步,程序就很难实现了。因为程序很难判断哪些声音是在CutScene中发出的,哪些声音是在游戏场景中发出的。而Wwise依靠总线依旧可以非常方便的实现这个需求。

接下来。对于声音设计师来说,声音是有优先级的,而声音的动态范围是有限的。玩家不可能听到所有的声音。Boss的技能总是要被听到,而小怪技能的声音优先级可以稍微低一些,玩家的脚步声只有在非常安静时才听得到。基于总线的混音功能可以满足这个需求。优先级高的声音在触发的时候可以动态的压掉优先级低的,使得在任何时候,玩家都能够听到设计师想让玩家听到的东西。很多缺乏混音处理的游戏,听起来杂乱无章没有重点,往往就是这里没有做好。

针对总线最大发音数限制,是性能优化中非常有效的一步。王者荣耀还在这个功能的基础上加上了RTPC控制,可以根据手机的性能、是否处于卡顿状态等情况动态修改限制的数量。到这一步可以说,没有中间件,是绝对无法完成这些需求的。

3、专业的音频插件

虽然手机性能有限,用到的效果器种类比较少,但是基础的混响及限制器还是会被用到。越来越多的专业效果器被集成在了Wwise中,一个好的效果器能够让游戏声音表现更上一层楼,而差的效果器足以毁掉设计师全部的心血。

除了效果器,我想重点说一下Wwise里的合成器。像饥荒这样的游戏,里面60%的声音可以通过合成的手段来完成。比如说背景的风声,火燃烧的声音,采集的Whoosh声。(虽然饥荒本身可能并不是这么做的。)声音合成相比传统的素材制作最大的优势是听感不会重复、零资源量、可以更多地和游戏中的参数联动。比如风声可以通过程序定义风速的参数从而控制风声的表现,这个风速还可以影响游戏中树的摇摆,使美术和声音的体验更统一。

相比数字音频工作站中的音频插件,Wwise内集成的插件可以获得更强的交互性。所有插件的参数都可以根据游戏中正在发生的事件平滑的更改。

想要了解更多可以参考Wwise官网。

Audiokinetic Plug-ins | Audiokinetic

4、交互音乐系统、打断机制以及3D衰减

对于手游来说,很多地方的声音设计都有所简化。但是音乐系统和UI系统,这两者相比端游是丝毫没有简化的。交互音乐系统、打断机制、3D衰减这三个功能放在一起说,是因为仅从功能上看的话,这三者交给程序实现起来难度都不大。但是其中隐藏了巨大的沟通成本

A音乐到B音乐切换时要播完当前小结再切换。B音乐到C音乐要立即切换,中间要做交叉淡化,Fade In 0.3s、Fade Out 0.5s。一个RPG手游,这样的音乐切换点有几千个。这些全让程序来做?那收到的结果一定是一切换音乐,就听到“咔”一声。

游戏中人物的对话,要后一句打断前一句,或者根据不同的人物分别设置不同打断。在战斗中,需要动态的触发一些对话,这里就要求前一句还没说完的情况下,后一句不能打断前一句,并且后一句不能和前一句同时播放。(崩坏3战斗中,战斗中触发的对话频繁被打断,个人认为这里的设计不够好。)

3D衰减也一样。要根据怪物体型、是否是boss,特效表现设置不同的3D衰减范围。Unity自带的音频系统好像有这个功能,但是并不能像Wwise中,通过

使用Unity5开发手游,使用FMOD或wwise音频插件而不是自带的声音系统有哪些好处?相关推荐

  1. 内行看门道:看似“佛系”的《QQ炫舞手游》,背后的音频技术一点都不简单

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 内行看门道:看似"佛系"的<QQ炫舞手游>,背后的音频技术一点都不简单 ...

  2. 如何开发手游联运平台?

    如果要从一个普通的手游代理商转到发行商,那么就必须要建立一个手游联运平台,建立自己的公司,这样才能保证自己的游戏代理资质合法.具体需要什么? 首先,你要做的就是建立一个平台.建立一个平台,进行公司注册 ...

  3. 一个人开发手游有多难

    [编者按]本文作者朱念洋. 谨以此文献给与我同样有创业梦想的程序员们. 我相信像我一样的程序员一定大有人在,一个人.一身技术.一腔热血,想要涉足手游领域,却不清楚会投入多少. 所以,我把自己的这次游戏 ...

  4. python有什么游戏可以开发-主流游戏引擎有哪些?python能开发手游?

    主流游戏引擎除了unity就是ue4,cocos2d-x坑越堆越多基本快成过去式了,至于其他霜寒等等实际各大游戏厂家都已经越来越少使用了.当然RPGmakerMV和GAMEMAKER这类其实也能占据一 ...

  5. 复盘2021年国内手游出海:大厂“吃饱”,中小厂商顺势“带跑”

    2021年,对于互联网行业来说倍感交集. 这一年,政策监管席卷了各个领域,互联网行业也身处风眼中心,互联网基本面增速放缓,不少企业纷纷裁员过冬. 回顾即将过去的2021,互联网诞生出诸多关键词,比如互 ...

  6. android 跳转崩溃_iOS系统突现大量bug! 英雄联盟手游配置需求公布、iOS13.5全设备越狱到来、三星手机系统崩溃...

    1英雄联盟手游配置需求公布近日英雄联盟手游发布消息称,将于6月份在巴西和菲律宾进行限量首测.同时还公布了英雄联盟手游对于设备配置的最低要求,如果是iOS设备的话最低需要 iPhone6 也就是A8处理 ...

  7. 内行看门道:看似“佛系”的《QQ炫舞手游》,背后的音频技术一点都不简单...

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 3月14日,腾讯旗下知名手游<QQ炫舞>正式上线各大应用商店,并迅速登上App Store免 ...

  8. Unity开发手游常用适配分辨率

    前言 工作开发中常用的需要适配的手机适配,这里做一下记录. 分辨率 1.新增分辨率 AspectRatio是长宽比,FixedResolution是设置固定分辨率. 2.适配长宽比 平时开发用9:16 ...

  9. 使用Golang开发手游服务器的感想

    从最初决定使用Golang开发游戏服务器(参考这里),到服务器基本成型,经过了两个多礼拜的时间.这里记录一下感想和心得.具体Golang的使用经验将来有时间会再开篇文章来写. 两个礼拜的时间,完成了G ...

最新文章

  1. Day08 - 面向对象编程基础
  2. 2 时间格式化_U盘无法格式化怎么办 U盘无法格式化解决教程【详解】
  3. js判断字符串是否为空_每日一课 | Python 如何判断一个字符串是否包含另一个字符串?...
  4. Netty实现长连接简单例子
  5. YANG-SUITE安装步骤
  6. CSS 动画指南: 原理和实战 (一)
  7. java中移动光标怎么写_java 程序当中无法做到光标跟随
  8. 红警ol服务器维护中1003,红警OL频繁掉线怎们么办 网络断开连接解决办法
  9. 同事篇(12年至今)
  10. 云计算基础与应用 第二章 云计算技术架构
  11. python桌面精灵_360uu游戏盒子
  12. 建设银行上海住房公积金业务网点
  13. Spring Framework框架起步,小白都看得懂(官翻版)!
  14. 第二篇:到底什么才是数据资产
  15. 手撸架构,Nginx 面试40问
  16. 【Git】fatal Not a git repository or any of the parent direc
  17. torchtext中文文本预处理使用流程文档
  18. Google Cloud的专业架构师和专业云工程师认证经验分享
  19. 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )
  20. win10 10016自动重启错误解决记录

热门文章

  1. 《谈判力》读书笔记:第二章 把人和事分开
  2. 「深度」国内真正有技术开发能力的不足200人,区块链是否“只是一种传说”?...
  3. EOS基金会的资金来源于哪里,被用于哪里?
  4. 【基于Swing+Java的推箱子小游戏的设计与实现(效果+源代码+论文+答辩PPT)墙裂推荐!!超级好玩儿!带背景音乐~~】
  5. Crap4J力求通过算法判定代码质量http://www.crap4j.org/
  6. HTML父页面监听子页面关闭并回调方法
  7. C语言二级考过指南,2016年计算机二级考试备考指南
  8. MATLAB-最佳平方逼近与非线性拟合例题--十安辰
  9. python如何删除txt里面的\n,\t
  10. 意法半导体:加大中国市场投入 重点布局物联网/车联网