2017年8月16日 星期三

Audio Effects on Unity–Native Audio Plugin SDK(1)

Reference:

1. Unity manual  for Native Audio Plugin SDK

2. Native Audio Plugins Bitbucket


在介紹主題之前,我先簡介一下 Unity 的聲音傳導過程。

Unity的元件列表中,可以找到 audio source 與 audio listener ,前者就像是喇叭,後者則是麥克風。假設我們將 audio source attach 在一個球體物件上,將 audio listener attach 在 main camera 上,再將音檔拖曳至 audio source 的 audio clip 欄位上,在按下 play 鍵時,audio source 會開始在場景中播放音檔,audio listener 則接收音訊資料並將結果輸出至電腦的音效裝置,完成這回合。只要你將任何一個人 disable 掉 (取消勾勾),就聽不到聲音。

由上圖 audio source 的屬性頁可以發現, Unity 已經提供了一些很基本 3D Sound Effect 的功能了,因此,在 Play 後你改變了兩者的相對位置及距離的話,就可以聽到聲音的方向有些許的改變。

這時候問題來了:如果我想要改變聲音的特性,或加上一些音效,該怎麼做呢?

一、MonoBehaviour.Update()

只要有一個元件它是繼承自 MonoBehaviour,當它有被 Enable,則 Unity 每過一段時間就會執行它的 Update,我們可以在取得 audio source 的 audio clip 後開始播放它,然後另外新增一個 audio clip 的物件,當 Update 被執行時將 original audio clip 丟進音效處理器,再將 output 寫去 new audio clip ,最後就是將 new audio clip attach 回 audio source 給它播放。

老實說這個作法在邏輯上看起來就怪怪的,我目前還是不懂為什麼可以新舊兩個 audio clip 同時播,卻只有新的被 attach 到 audio source,另個團隊能想到這個作法真的很厲害。

二、MonoBehaviour.OnAudioFilterRead()

原理跟上面差不多,但這個就是直接拿 original audio clip 來做,做完就寫回去並播放,在邏輯上比較合理。另外,這個 function 是由另一條 audio thread 所呼叫,因此在程式執行上比前者更有效率。

三、鏘鏘鏘鏘

沒錯!最有效率的當然是做成 Native Audio Plugin 了,原因無它,前兩者看到的函式都是 C# script,而這個方法則是在底層 (C++) 就做掉了,所以當你在 trace 其他家廠商寫的 Plugin 時,是看不到哪邊有 audio I/O 的行為的。

 

つづく

沒有留言: