Wwise概述

强大的游戏音频中间件,程序和音频制作流程分离,各司其职,强大的混音,较多的优化手段,内置多语言支持,多平台支持,每个平台独立调整设置。

Wwise优点

如使得Unity跟音效模块完全分离、具有性能调试工具、具有丰富的混音器等。

集成Wwise到项目

首先在Wwise官网下载WwiseLauncher和SDK,需要注册一个账号,用邮箱就可以。

选择Unity这栏,可以看到Unity的项目点击Integrate Wwise into Project

上面是选择Wwise的版本号,集成到Unity的Packages选择。

Copy of Wwise SDK files 这一栏必填,选择下载的Wwise SDK路径。

Wwise Project Path 这一栏可不填,用于集成已有的Wwise项目。

Unity Installation 这一栏必填,选择Unity的安装目录Unity.exe。

点击 Integrate 进行集成安装,最后会在Unity项目的工程目录里生成Wwise相关的文件,生成的_WwiseProject结尾的副本目录需要删除,否则会引起冲突。

Wwise项目工程及调试

创建一个WwiseProject界面如下,以下是Profiler调试工具,可在Layouts切换显示,具体用法见官网文档。

点击如图按钮,通过ip进行连接设备调试,设备需要和电脑在同一局域网上。

连接后可以查看运行时的日志和状态,方便调试查bug。

Unity中使用Wwise(不同版本的Wwise可能会有变动)

Wwise初始化组件(必须)

AkGameObj 用于给WwiseEngine PostEvent 触发事件播放音频,声音源。

AkAudioListener 声音接收器。

SoundBank

Wwise中Event需要提前加载对应的bank,对应.bnk文件。

使用 AkSoundEngine.LoadBank(bankName);加载,AkSoundEngine.UnloadBank(bankName);卸载,或AkBankManager.LoadBank(bankName);加载,AkBankManager.UnloadBank(bankName);卸载。

PostEvent

触发事件播放音频。

AkSoundEngine.PostEvent(eventName, gameObject);

PostEvent回调函数

AkSoundEngine.PostEvent(eventName, gameObject, in_uFlags, in_pfnCallback, in_pCookie);

其中in_uFlags的类型是AkCallbackType

  • AK_EndOfEvent: 事件结束时触发的回调。
  • AK_EndOfDynamicSequenceItem: 动态序列中的一个项目结束时触发的回调。
  • AK_MusicSyncBeat: 音乐同步节拍时触发的回调。
  • AK_MusicSyncBar: 音乐同步小节时触发的回调。
  • AK_MusicSyncEntry: 音乐同步入口时触发的回调。
  • AK_MusicSyncExit: 音乐同步退出时触发的回调。
  • AK_MusicSyncGrid: 音乐同步网格时触发的回调。
  • AK_MusicSyncUserCue: 音乐同步用户提示时触发的回调。
  • AK_MusicSyncPoint: 音乐同步点时触发的回调。
  • AK_Marker: 标记点触发的回调。
  • AK_Duration: 持续时间触发的回调。
  • AK_MusicPlayStarted: 音乐开始播放时触发的回调。
  • AK_MusicSyncAll: 所有音乐同步事件触发的回调。
  • AK_MusicPlaylistSelect: 音乐播放列表选择时触发的回调。
public void EventCallback(object in_cookie, AkCallbackType in_type, AkCallbackInfo in_info)
{
    if (in_type == AkCallbackType.AK_EndOfEvent)
    {
        //事件结束回调
    }
    else if (in_type == AkCallbackType.AK_Duration)
    {
       //获取持续时间
       AkDurationCallbackInfo durationInfo = (AkDurationCallbackInfo)in_info;
       float duration = durationInfo.fEstimatedDuration;
    }
}

RTPC

用于配合Wwise,实现动态控制,如音量,传递某些游戏参数等。

设置RTPCValue:AkSoundEngine.SetRTPCValue(RTPCName, RTPCValue);

获取Wwise中的RTPCValue:AkSoundEngine.GetRTPCValue(string in_pszRtpcName, GameObject in_gameObjectID, uint in_playingID, out float rValue, ref int io_rValueType );

其中io_rValueType是enum AkQueryRTPCValue,不使用RTPCValue_PlayingID类型的话可以忽略in_playingID。

例如想要获取音频的电平值:

 int refType = (int)AkQueryRTPCValue.RTPCValue_Default;
 float rtpcValue = 0;
 //"xxx"的是Wwise里RTPC参数名,WwiseObj是挂AkGameObj的GameObject。
 AkSoundEngine.GetRTPCValue("xxx", WwiseObj, 0, out rtpcValue, ref refType);

Wwise落地到项目中需要考虑的方面

  • 音频资源的大小以及运行时音频资源的使用情况。
  • 内存和cpu的使用以及播放声音数量(设备上使用情况尤为重要)。
  • 播放音频是否会造成卡顿现象(可能会造成的原因有音频资源太大、同帧播放音频数    量太多等)。

遇到问题解决方向

  • 设备连接Profile调试,查看Capture Log和SoundBanks信息。
  • 遇到报错首先查看 Wwise官网帮助文档
最后更新于 2024-06-18