Unity手游的Wwise初始化(考虑热更)
https://zhuanlan.zhihu.com/p/32055700
Unity手游的Wwise初始化(考虑热更)
游戏音频设计师、技术音频
这篇文章是写给音频程序员的。本来想写的更全面一些顺便帮设计师了解这部分流程,但是写的时候发现我并不知道哪些信息是设计师不了解的,展开一切细节又太琐碎,所以这篇文章就只针对程序员了。
Wwise官方的Unity集成已经做了简单的初始化,但是默认的初始化流程无法满足热更等需求,而且在游戏启动时初始化Wwise会延长程序启动时间,对于一些项目这是不可接受的。所以我总结了一些常用的初始化处理方式,希望对你的项目有些帮助。
Wwise初始化(考虑热更)需要以下几个步骤:
一、加载AkTerminator、AkInitializer两个脚本
这里有两种方法,可以根据需求选择一种。
1、 动态加载这两个脚本,之后通过修改AkInitializer里的属性来改变设置。优点:简单方便。缺点:因为在加载AkInitializer时就会完成Wwise初始化。这里只有少部分参数设置(例如Log开关)会生效,另外的大多数参数设置(比如SoundEngine内存分配,默认语言)不会生效。
2、 将这两个脚本制作成Prefab,音频初始化时实例化这个prefab。优点:所有初始化参数都可以配置并热更。缺点:需要在初始化Wwise时进行prefab的实例化操作。
大多数情况下,初始化参数不需要通过热更的方式修改。但是在Wwise2017.1.3版本Wwise曾出现过一个重大bug,初始化参数里内存如果设置过小,游戏就会大概率出现闪退。当时有个项目我们恰好选择了第一种方式,最后不得不整包更新才解决了这个问题。所以,推荐使用第二种方式加载这两个脚本。
二、注册全局声音对象,用于所有2D声音的播放。
我们通常会自己管理一个对象播放所有2D声音(音乐、环境、UI)。这个对象不需要同步坐标,也省去了频繁注册注销SoundObject的损耗。这个步骤能够节省大量的CPU资源。
三、加载需要在游戏开始就要用到的SoundBank(比如音量设置、UI、音乐等)
Wwise使用string作为LoadBank的参数,有三种方式可以实现这个需求:
1、 在lua中保存一个字段记录要加载的SoundBank Name,调用C#接口加载。
2、 做一个.asset配置文件,C#从配置文件中读取要加载的SoundBank Name。
3、 将加载SoundBank操作做成prefab,在初始化时实例化prefab。
初始化时要加载的SoundBank通常需要设计师修改,第三种方式对设计师最友好,但是也需要prefab的实例化操作。
四、音量的初始化设置
关于音乐、音效、语音的开关及音量的设置应该保存在客户端本地,并在Wwise播出第一个声音前设置正确的参数。设计师一般会将Mute、Unmute(开关)操作封装成Event,BusVolume(音量)设置封装成RTPC,然后打包为SoundBank交给程序调用。所以这一步骤依赖LoadBank的完成。一般情况下项目使用的LoadBank方法是异步的。所以这里需要把跟这个功能有关的SoundBank单独拆出来,使用同步的方式加载,或者通过回调确定LoadBank已完成。
以上所有操作应该在C#内被封装成一个方法,让lua在合适的时机去调用。
关于热更:
Wwise提供了两个API用于设置SoundBank路径。分别是SetBasePath和AddBasePath。SetBasePath设置基础目录,AddBasePath设置后续DLC目录。Wwise允许设置多个DLC目录,LoadBank时会从最后一次AddBasePath的路径依据SoundBank的文件名开始搜索,依次向前最后到SetBasePath的路径,搜索到第一个目标SoundBank后加载。
(注意,AddBasePath不是全平台都有效。在PC下是无效的,所以不能在PC平台测试。)
在iOS和Android平台:
SetBasePath的默认路径为:
Application.streamingAssetsPath/Audio/GeneratedSoundBanks/(Platform)
AddBasePath的默认路径为:
Application.persistentDataPath
一般我们会把这里改为:
Application.persistentDataPath/Audio/GeneratedSoundBanks/(Platform)
在发布热更包时,将音频资源放到对应位置即可。
官方文档对于热更部分的描述:Making DLCs with
Wwise and Unity
关于初始化时机:
Wwise有两种SoundBank,Init bank和资源bank。默认情况下Init bank不需要手动加载,在AkInitializer.Initialze();会加载这个bank。Init bank中保存了关于总线、游戏同步器(游戏参数,切换开关和状态)和环境效果的设置。
考虑到Init Bank也需要热更。初始化有以下几种选择:
1、 在完成资源热更后再进行初始化。这样最安全,但是在热更完成前,一直会处于无声的状态。(市面上大多数产品最终都选择了这个方案。)
2、 在游戏运行时进行初始化,同时载入一个登陆音乐的SoundBank,播放音乐。热更完成后,卸载Init Bank和登陆音乐的SoundBank并重新加载。这里要避免使用异步加载卸载的接口。Wwise官方不推荐这样做。
3、 在游戏运行时进行初始化,同时载入一个登陆音乐的SoundBank,播放音乐。热更完成后不重新加载。游戏下次运行时会使用全新的SoundBank,本次会使用旧的Init bank及登陆音乐SoundBank。Wwise官方同样不推荐这样做。(我们的产品大多数使用了这种方案。)
这里需要注意,非Stream的SoundBank文件在加载后被播放时,源文件不会被占用,可以通过热更替换。而Stream文件播放时,源文件会被占用,不能热更。所以第2、3种方法里的登陆音乐如果有热更需求,就不能使用Stream。
官方文档对于DLC SoundBank的描述:DLC 注意事项及限制