有小夥伴反應:在使用 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 的 SDK 和示例工程。
點選對應版本的 Launch 可以開啟真正的 Wwise 編輯器,建立一個 Wwise 工程。
建立介面如下:
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 做分析:
DEMO
SDK
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 專案下建立的目錄:
include 來自 /include
prebuilt 為新建資料夾,裡面放置各個平臺的預編譯庫(來自 Wwise-SDK)
proj。xxx 為各平臺的工程配置檔案
WWiseHelper 為一個單例項的 Wwise 管理器,程式碼可以先複製 cocos2dx-IntegrationDemo 的 WwiseWrapper
其餘都來自 /samples/SoundEngine
我們先來編譯 Windows、Android、iOS 的 SDK,之後再看看如何讓它順利執行起來。
SDK-Windows
用 VS 開啟 Cocos 的 sln 工程,新建一個 libwwise 工程,併為入口專案設定依賴項:
libwwise 的各個配置我們先完全參考 libcocos2d 的配置, libwwise 增加目錄包含:
game 工程也新增目錄包含:
game 工程增加連結庫檔案目錄和相應的 lib 檔名:
libwwise 工程將 win32 和 common 的程式碼檔案加入進來,把 WWiseHelper 也加入進來:
修改掉一些編譯報錯和一些程式碼報錯,Windows 基本就編通了。
SDK-Android
安卓的 jni 編譯,需要編寫 mk 檔案, 參考 cocos2dx-IntegrationDemo 的寫法,基本能滿足需求:
不過為了工程化管理,筆者單獨寫了 mk 檔案,給主工程引用,方便管理,內容與 Demo 的大同小異:
SDK-iOS
iOS 工程下我們同樣建立一個 lib 工程,把檔案和 lib 庫都加入進去:
SDK-WWiseHelper
把 Wwise 庫編譯進去後,接下來我們介紹怎麼使用。
在使用前,我們至少要先準備一些簡單的 Wwise 資源,方便 runtime 呼叫。
開啟 Wwise 編輯器新建一個工程,把一個 wav 頻拖入進去:
右鍵這個音訊,New Event->Play:
切換到 SundBanks,我們新建一個 Main 的 bnk:
在選單的 Layouts 切換 SoundBnk,然後把 Play_ttt 事件拖動給 Main-bnk,點選 Generate,釋出成功:
按照官方 SDK 文件介紹,Wwise 的 runtime 只會用到 Init。bnk 和 Main。bnk。我們只需要呼叫 Wwise 的介面傳送 Play_ttt 的事件,那麼遊戲就會播放這個音訊。
回過頭來看 WWisehelper,我們之前只是簡單 copy 了 cocos2dx-IntegrationDemo 的內容。
只提供了初始化,銷燬,每幀呼叫 render 的參考程式碼。別的嘞?沒關係,官方的 SDK 提供了完整的資料,看完官方文件,在查閱 SDK 的標頭檔案,不難發現,基本的 API 都在這裡:
所以我們可以根據這些 API,擴充套件下 WWiseHelper:
基本功能就是
載入解除安裝 bnk、註冊 object、傳送 event、暫停、繼續、停止、rtpc 控制
等。
在 game 的 AppDelegate 中需要加入 Wwise 的
生命週期管理(暫停,繼續,銷燬)
。
注:plugin 名稱空間就不用 care 了,這是我們的所有擴充套件庫的名稱空間。
透過 jsb-binding 匯出給 js 端呼叫(你們都會的):
在 ts 端新建的 d。ts 新增介面申明:
在 ts 中再次封裝一個 player 類,初始化的時候,載入2個 bnk,就可以呼叫 postEvent 播放了:
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 關鍵程式碼:
Android 關鍵程式碼:
當你準備好這些,並且全部編譯透過,打包到手機上,就能正確聽到 Wwise 的音效輸出了,真的很絲滑有沒有。
*本文源自「樂府札記」公眾號