C#Unity

FMod使用小记

Spread the love

Why FMod?

  • Unity自带的AudioSystem也是使用FMod的,功能也非常强大,但是相较于原生FMod还是逊色不少,对于音效师而言限制多多。使用FMod的话可以最大程度上做到关注点分离,程序将就做程序的事情,音效师做音效师的事情。
  • AudioSource基于Monobehavior,并不是很灵活,定制性不强,并且在AddComponent等情况下效率很低。FMod则可以在代码层面控制音频,不需要任何Component。
  • 不过如果只是小游戏的话使用AudioSource会更方便,FMod集成起来会花一些时间,并且不能通过Unity自带的Profiler来进行分析——不过FMod的分析工具更加强大

 在FMod当中的概念:

  •  Event:每一个音效事件,音效最基本的单位,会对应一个EventPath以及UUID
  •  Instance:Unity下的概念,相当于一个Event的实例,会进行音效的播放
  •  Bank:用于储存多个Event,同一个bank将会打包成一个.bank文件
  •  Bus:给bank进行分组,对多个bank进行统一的管理,例如最多同时播放的音效数量,例如滤波器
  •  VCA:主要用于控制音量比较简单

Bank的分类:

  • FMod自己会生成两个全局的bank:
  • Master.bank以及Master.string.bank,这Master.bank储存了全局的设置而 Master.string.bank则储存了所有的Event索引。
  • 之后就是我们自己生成的bank,bank中的内容包含两块:Meta数据以及sampledata

Unity与FMod

下载Unity插件

[FMod官方文档]

大多代码相关的东西都在文档里了,东西也不多,自己简单封装一下就可以很好地进行使用了。

FMod加载方式

一般FMod在Unity中加载的方式有两种:
一种是直接放置在StreamingAssets文件夹下面,在游戏进行的过程当中就会自动进行加载。
另一种是通过AssetBundle来读取bytes来进行加载。

不过通过AssetBundle加载bytes的时候需要分配大块的bytes内存,不太好进行管理,所以目前我们使用的是StreamingAssets的加载方式。需要热更新的时候我们就直接从presidentdata中进行loadbank就可以了。

//加载bank
RuntimeManager.LoadBank(bank)

//播放声音
RuntimeManager.PlayOneShot(path, position)

与音效师合作

音效师将音效放入到bank当中,然后程序通过事件进行调用,也可以传参数,类似走路的声音,在不同的地面会有不一样的声音,都可以通过传参数来解决,例如声音同时播放的数量,声音的混合,淡入淡出,可以完全交给音效师在FMod中进行完成。

在官网上下载FMod工具

FMod使用优化

FMod自带了很多方便的接口,RuntimeManager基本上可以解决大部分的问题,并且封装了Loader以及Emitter,但是Loader以及Emitter是基于Monobehavior的效率并不是很好,所以我们可以根据Emitter来自己封装一个EmitterManager来对音频的Instance进行管理。
在使用FMod之后可以将Unity的AudioSystem进行关闭。

FMod中的调试

打开LiveUpdate以及Debug Overlay就可以直接看详细的内存占用了

在FMod中也有专门的Profiler窗口来对Unity中的音效使用进行监听,甚至对API的调用都能直接监听到,比Unity中的Profiler更加专业详细。同样的,这也可以在手机上进行调试。

其他的中间件

Wwise,不过据说还是FMod更好用一些

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.