Wwise – Loadbank的大大小小事。

在聲音播出之前都要確定Bank已經加載在正確的場景才可以哦!

前言

在專案一開始前,我們通常要準備好加載到引擎裡面的素材,這些檔案會在Wwise裡面打包成多個Bank,隨着專案不同的場景和關卡,我們會需要做出不同的bank來分別加載和讀取來節省遊戲的暫用的資源。

bnk裡面包含了聲音的Event和Game Sync參數(Switches / States / Parameters / Triggers),所以沒有加載bnk之前,引擎並不知道該播什麽聲音喔!

Bank是什麽?

每次開新專案都會有各式各樣的Wav,Ogg等着被傳到伺服器上,如果不把這些素材整理起來,數量可說是相當驚人(容量也是),作為一個合格的聲音引擎,把這些音效和音樂打包在一起的功能那當然是不可或缺的。Bank 雖然結尾附檔名都是,但主要分為下面兩種:

InitBank

初始化資料數據庫

Init bank 裡面包含了總線層的GameSync數據,通常在引擎內需要隨時讀取和使用

SoundBank

遊戲聲音資料數據庫

SoundBank包含了Event元素和相關事件使用到的媒體和GameSync,只在需要的時機加載即可。

https://www.audiokinetic.com/zh/library/2017.2.10_6745/?source=WwiseFundamentalApproach&id=conclusion_conclusion

在Wwise裡面所有資訊可以分成五大元素。Bank會將所有Wwise設定好的數據集成給遊戲引擎使用。(參考:鏈接

對音效設計師來說,我們只要知道現在需要使用什麽event,RTPC,state或是Switch,而程式設計師則負責在Unity引擎註冊這些物件,讓wwise知道遊戲那邊發送了什麽參數,接收並根據音效設計師封裝好的Event來播放出想要的效果。

解析Bank的結構

blank

Wwise Bank的結構大致分成:

  1. DecodedBanks (Folder)
  2. Languages (Folder)
  3. Init.bnk
  4. (Your_Banks).bnk

◈ Platform(Windows)\DecodedBanks:

如果在腳本中有啟用“Decode Bank” 且 “Save Decoded Bank”的話,會將解碼後的bank存在這個資料夾下。(原本4M的Bnk解碼後大約40M。)

◈ Platform(Windows)\Languages :

遊戲中如果有使用到多語系的bank將會生成在這個位置,不會生成在Bank根目録。

如何在場景裏面Loadbank?

想要在關卡裏面加載Bank的話,我們可以直接在Wwise Picker標籤下找到Bank分類,直接將要讀取的bank拖放至Inspector區域,並設定好Trigger的時機點就可以了。

◈Trigger Start:何時加載Bank到場景上。
◈Trigger End:何時將bank從場景上卸載。

管理Soundbank的方式有哪些?

方式1:單一化Bank模式

全部的音效都放置`在同一個Bank內,並且常駐於所有場景上,不會隨着關卡切換而消失。

優缺點

  • Pros:不用頻繁對Bank做讀取,只要加載後所有相關媒體和Event都可以隨時使用。是最簡單好管理的方式。
  • Cons:如果單一的Bank媒體檔案過大,容易造成記憶體資源控管問題,佔用資源影響效能。

方式2:依照種類區分Bank

全部的音效都放置`在同一個Bank內,並且常駐於所有場景上,不會隨着關卡切換而消失。

優缺點

  • Pros:不用頻繁對Bank做讀取,只要加載後所有相關媒體和Event都可以隨時使用。是最簡單好管理的方式。
  • Cons:如果單一的Bank媒體檔案過大,容易造成記憶體資源控管問題,佔用資源影響效能。

方式3:Prepare Event模式


全部的音效都放置`在同一個Bank內,並且常駐於所有場景上,不會隨着關卡切換而消失。

優缺點

  • Pros:不用頻繁對Bank做讀取,只要加載後所有相關媒體和Event都可以隨時使用。是最簡單好管理的方式。
  • Cons:如果單一的Bank媒體檔案過大,容易造成記憶體資源控管問題,佔用資源影響效能。

在特定的情況下Loadbank

那在Unity裡面播放我們前面在STUDIO做好的Event要怎麽做呢?回到Unity裡面我們新建一個FMOD_ProgrammerSound的Script。

以下的腳本是從API使用手冊摳過來的官方寫法,具體可以理解成:
#1:設定callback
#2:初始化需要播放的Event路徑
#3:選擇Unity尋找Audio播放的位置(從SteamingAsset / Banks)
#4:Play();

  public void Loadbank()
    {

        banklist.Add(bank);
        if(banklist != null)
        {
            foreach (var singlebank in banklist)
            {
                if(!loadAsynchronous)
                {
                    singlebank.Load(decodeBank,saveDecodedBank);
                }
                else
                {
                    singlebank.LoadAsync();
                }
                if(singlebank.IsValid())
                {
                  print( singlebank.Name + " Has Loaded");  
                }
            }
        }
        UnityEngine.Debug.Log("[Wwise] : Load All banks from list");
    }

(註解的部分是在StreamingAsset下播放音效檔案,此種方式播放的音效在Keyname需要添加”副檔名”,EX:Play(“Hello.wav”);)。

    void UnloadBank()
    {
        if(banklist!=null)
        {
            foreach (var singlebank in banklist)
            {
                singlebank.Unload();
                if(!singlebank.IsValid())
                {
                    print(singlebank.Name + "Has Unloaded");
                }
            }
        } 
    }

記得分配播放的音效位置到想要的Object上,如果沒有set3DAttributes會導致聲音播放的位置不正確。

加載BANK就會有聲音了…嗎?

根據官網的描述,想要在Unity裡面播放出聲音,我們必須先把播放event相關的Bank加載,如果在還沒有Loadbank之前就嘗試PostEvent()的話,就會被Wwise狠狠甩出了Event ID Not Foun的紅字。

行,道理我都懂,那我Loadbank不就好了嗎?這時候播放音效時,Wwise又跳出:Media Was not Loaded for this source. 怎麽回事?

要知道為什麽聲音播不出來,要先知道Loadbank到底Load到了什麽東西。在wwise的Bank界面下,可以發現Bank儲存了3種資訊。一共有:

#1:Bank Event
#2:Bank Structure
#3:Bank Media Files.

◈Event:

◈Stucture:包含引用的MediaFile文件檔案路徑和名稱,如果在導出時勾了這個選項,可以發現從SoundbanksInfo.xml文件下的Bank ID內多了這個區塊。

<ExcludedMemoryFiles>
     <ShortName>YourFilesName.wav</ShortName>
     <Path> SFX\YourFilesName.wem </Path>
</ExcludedMemoryFiles>

(註解的部分是在StreamingAsset下播放音效檔案,此種方式播放的音效在Keyname需要添加”副檔名”,EX:Play(“Hello.wav”);)。

記得分配播放的音效位置到想要的Object上,如果沒有set3DAttributes會導致聲音播放的位置不正確。