史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

有小夥伴反應:在使用 Cocos Cretaor 開發

原生遊戲

時,音訊的表現常常不盡如人意。其實,我們可以透過使用一些專業的音效庫,

如 Wwise、fmod 等

,提升原生遊戲的音訊表現。

樂府互娛

的技術團隊將透過今天的這篇文章,同大家分享

在 Cocos Creator 中接入和使用Wwise

的超詳細技術實現過程,讓你的原生遊戲也能「縱享絲滑音質」。

Wwise 介紹

Wwise 是 Audiokinetic 公司出品的

遊戲互動音訊解決方案

,有一系列內建的空間音訊功能。《刺客信條》、《守望先鋒》、《崩壞3》、《王者榮耀》等一些我們耳熟能詳的 3A 大作的音訊模組都採用了 Wwise,很多遊戲大廠,如騰訊、米哈遊、遊族、巨人、莉莉絲、暢遊等都有專門的 Wwise 音效團隊。

Wwise 提供包括多語言的實現、不同材質的腳步聲、玩家的心跳聲隨著 HP 的變化而變化,以及 3D 音效、背景音效、配音強弱的控制等;其次還有遊戲音效的效能最佳化和音效資源包體最佳化,包括 Wwise 的內建效能分析工具 Profiler 的使用,以及常見的音效效能瓶頸和針對性的最佳化策略等。

Wwise 使用準備

免費註冊 Wwise 賬號:

https://www。audiokinetic。com/zh/sign-up/

註冊帳號並登陸後,註冊一個專案後可以拿到授權,此步驟也可以最後再研究,不影響接入和測試使用。當前 Wwise 的免費版本一個專案最多支援

500個音效

,能夠滿足大部分中小專案需求。

下載 Wwise 編輯器:

https://www。audiokinetic。com/download/

下載完成後開啟,發現這其實是個 Launcher(類似 Cocos Creator 的 DashBoard),在 Launcher 切換 Wwise 頁籤可以下載新版的 Wwise 編輯器。

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

特別提醒:對應版本編輯器安裝目錄包含了 Wwise 的 SDK 和示例工程。

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

點選對應版本的 Launch 可以開啟真正的 Wwise 編輯器,建立一個 Wwise 工程。

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

建立介面如下:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

OK,到這裡,準備工作就做好了,當然還有兩個比較有用的網址一定要記住去白嫖↓

官方 SDK 文件 :

https://www。audiokinetic。com/zh/library/edge/?source=SDK&id=index。htm

基礎影片教程:

https://space。bilibili。com/17571301/video

SDK 接入

Cocos 沒有 Wwise 的官方一鍵整合,並不代表它不支援 Cocos。

我們參考一下 DEMO 再結合官方 SDK 做分析:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

DEMO

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

SDK

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

SoundEngine

參照 cocos2d-x-IntegrationDemo 的 Windows 工程,並對比 Wwise-SDK 和 Wwise-SDK 下 samples 目錄裡的

SoundEngine

工程,不難得出:

可以整合 Wwise 提供的預編譯庫到 Cocos 原生工程,Wwise 的所有功能都透過 include 資料夾裡的標頭檔案暴露;

Wwise 本身不提供檔案路徑定位的功能,需要實現對應 Wwise 申明的抽象介面,並註冊給 Wwise 使用,並且 iOS、Android、Windows 的實現不一樣。不過 SoundEngine 基本給我們實現的七七八八了,我們只需要考慮 Cocos Creator 原生端的熱更新+檔名與 UUID 的對映;

我們可以自己封裝一個 Wwise 的單例項管理器去管理 Wwise 的生命週期,以及封裝載入、播放、暫停等介面,並透過 jsb 暴露給 js 呼叫,方便邏輯開發。

下面是我在 Cocos Creator 的 native 專案下建立的目錄:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

include 來自 /include

prebuilt 為新建資料夾,裡面放置各個平臺的預編譯庫(來自 Wwise-SDK)

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

proj。xxx 為各平臺的工程配置檔案

WWiseHelper 為一個單例項的 Wwise 管理器,程式碼可以先複製 cocos2dx-IntegrationDemo 的 WwiseWrapper

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

其餘都來自 /samples/SoundEngine

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

我們先來編譯 Windows、Android、iOS 的 SDK,之後再看看如何讓它順利執行起來。

SDK-Windows

用 VS 開啟 Cocos 的 sln 工程,新建一個 libwwise 工程,併為入口專案設定依賴項:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

libwwise 的各個配置我們先完全參考 libcocos2d 的配置, libwwise 增加目錄包含:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

game 工程也新增目錄包含:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

game 工程增加連結庫檔案目錄和相應的 lib 檔名:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

libwwise 工程將 win32 和 common 的程式碼檔案加入進來,把 WWiseHelper 也加入進來:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

修改掉一些編譯報錯和一些程式碼報錯,Windows 基本就編通了。

SDK-Android

安卓的 jni 編譯,需要編寫 mk 檔案, 參考 cocos2dx-IntegrationDemo 的寫法,基本能滿足需求:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

不過為了工程化管理,筆者單獨寫了 mk 檔案,給主工程引用,方便管理,內容與 Demo 的大同小異:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

SDK-iOS

iOS 工程下我們同樣建立一個 lib 工程,把檔案和 lib 庫都加入進去:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

SDK-WWiseHelper

把 Wwise 庫編譯進去後,接下來我們介紹怎麼使用。

在使用前,我們至少要先準備一些簡單的 Wwise 資源,方便 runtime 呼叫。

開啟 Wwise 編輯器新建一個工程,把一個 wav 頻拖入進去:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

右鍵這個音訊,New Event->Play:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

切換到 SundBanks,我們新建一個 Main 的 bnk:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

在選單的 Layouts 切換 SoundBnk,然後把 Play_ttt 事件拖動給 Main-bnk,點選 Generate,釋出成功:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

按照官方 SDK 文件介紹,Wwise 的 runtime 只會用到 Init。bnk 和 Main。bnk。我們只需要呼叫 Wwise 的介面傳送 Play_ttt 的事件,那麼遊戲就會播放這個音訊。

回過頭來看 WWisehelper,我們之前只是簡單 copy 了 cocos2dx-IntegrationDemo 的內容。

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

只提供了初始化,銷燬,每幀呼叫 render 的參考程式碼。別的嘞?沒關係,官方的 SDK 提供了完整的資料,看完官方文件,在查閱  SDK 的標頭檔案,不難發現,基本的 API 都在這裡:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

所以我們可以根據這些 API,擴充套件下 WWiseHelper:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

基本功能就是

載入解除安裝 bnk、註冊 object、傳送 event、暫停、繼續、停止、rtpc 控制

等。

在 game 的 AppDelegate 中需要加入 Wwise 的

生命週期管理(暫停,繼續,銷燬)

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

注:plugin 名稱空間就不用 care 了,這是我們的所有擴充套件庫的名稱空間。

透過 jsb-binding 匯出給 js 端呼叫(你們都會的):

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

在 ts 端新建的 d。ts 新增介面申明:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

在 ts 中再次封裝一個 player 類,初始化的時候,載入2個 bnk,就可以呼叫 postEvent 播放了:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

SDK-

相容 Cocos Creator

的資源管理方式

然而,當你做完上面的所有步驟,你會發現可能還是不能正確播放,看 log 會發現 Wwise 報錯顯示未找到

Init.bnk

Main.bnk

原因很簡單,因為當你把資源放到 Creator 編輯器下的 assets 目錄後,經過 Creator 釋出打包後,所有資源都會被重新命名為 uuid 形式放在 Cocos 的 bundle 下的 native 目錄。

想解決這個問題有兩種方式:

方法一:自建資源目錄,

這個目錄不放在在 assets 目錄,打包後也不歸 bundle 管理。

方法二:把 uuid 和原檔名關聯隱射,讀取時把原檔名轉化為真正的 uuid。

第一種比較簡單,沒什麼挑戰,所以不介紹了,我們介紹

第二種

(我們就是喜歡挑戰最難的),下面為實現方式:

假設將整個 Wwise 工程匯出的內容都放在 resouce-bundle 下,那麼我們建立一個 resouces/bnk 資料夾(如果在別的 bundle 下同理)。

新建一個 bnk。txt 放到上面目錄中。

在 bnk。txt 裡記錄所有 bnk 和 wem(wem 為單獨未合併音訊-可在官網 SDK 文件檢視)檔案對應的 uuid 檔名。

bnk。txt 的內容可以透過 Creator 外掛模式自動監聽檔案變化生成,uuid 直接讀取 。meta 為檔案裡的即可。

初始化 Wwise 時,先獲取 resouces-bundle 的 native 路徑,再把 bnk。txt 中記錄的隱射關係傳給 Wwise,那麼所有的 Wwise 匯出檔案都能根據 uuid 直接獲得在 resouce-bundle 的 native 資料夾下的實際相對路徑。

獲取的 uuid 路徑再透過 cocos2d::FileUtils::getInstance()->fullPathForFilename 得到最後熱更新最新版本的路徑。

Android 版在 Cocos 會得出 @assets/ 字首的路徑,代表的是包內內容,需要透過 Android 的 AssetManager 讀取,讀取時(Wwise 有自己的讀取檔案函式封裝),需要把 @assets/ 字首去除,需要特殊處理下資源路徑圖:

iOS+Windows 關鍵程式碼:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

Android 關鍵程式碼:

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

史上最清晰的 Wwise 接入與使用分享丨Cocos Creator

當你準備好這些,並且全部編譯透過,打包到手機上,就能正確聽到 Wwise 的音效輸出了,真的很絲滑有沒有。

*本文源自「樂府札記」公眾號

TAG: WwiseSDKbnkCocos音效