2015年4月12日 星期日

迅速學會Unity5 AudioMixer

Unity5在音樂音效的管理上, 為我們提供了一個全新的AudioMixer系統
以下我會盡量用最簡短的文字說明, 搭配圖片來讓各位學會如何使用AudioMixer

首先先看一眼已經建置好的AudioMixer大概會長什麼樣子


如你所見, 這會是個介面有點小複雜的管理系統, 下面我們將各個區域標上號碼
並用最簡短的句子為您做說明


1.
Mixers, 這裡會列出整個專案中所有的Mixer
提供你快速切換的功能

2.
Snapshots, 簡單的描述就像是Unity的版面設置提供的那個Layout功能
每個Snapshot都會記下Mixer現在的配置狀態, 方便快速切換
你可以用這個功能來營造很多種不同的遊戲狀態

3.
Groups, 這裡預設一定要有Master, 他底下會用樹狀結構讓使用者自己建Group
每個被建出來的Group都可以用來管理一個種類的聲音
你可以隨便點選一個有掛載AudioSource的GameObject
上面你可以找到, Output這個新增的欄位, 就是用來選擇
選擇你要將這個AudioSource分類為哪一種聲音

請注意, 因為樹狀的觀念, 所以父節點會影響子節點

4.
Views, 隨著遊戲愈做愈大, 你應該會將Group建得五花八門的數量超多
這時候我們可以透過View的功能去管控Groups上面每個Group的眼睛(顯示控制)
用來快速的切換我們想看到的Group

5.
Edit in Play Mode 和 Exposed Parameters

Edit in Play Mode這個按鈕只會在執行期間出現, 按下去以後
Unity可以允許你在遊戲執行期間去調整AudioMixer

Exposed Parameters
這裡是一個簡單的變數清單, 在AudioMixer中
很多變數都是可以被程式碼操作的, 但是每個你想要用程式碼操作的變數
都必須先透過右鍵選取Expose, 讓這個變數被暴露出來, 你才可以操作得到
所有當前被暴露出來的變數, 都可以在Exposed Parameters看到
並且重新命名為有意義的名稱, 程式碼必須透過這個名稱
才能操作得到此變數

6.
這個長條狀代表著的也是一個AudioGroup, 一個圖像化的AudioGroup
透過右鍵, 你可以依照需求, 為這個AudioGroup標上不同的顏色進行分類辨識

黃色帶個0的箭頭
這代表目前這個Group是否調整輸入的聲音分貝
0就是不調整, 負的就是調小, 正的就是調大
但請注意, 如果你要調整的是聲音的音量
那麼建議點選該Group後, 去調整Attenuation的Volume

[S][M][B]
S代表Solo, 點了之後, 除了其他也勾選S的聲音之外, 所有聲音都是聽不到的
M代表Mute, 點了之後, 所有掛名在這個Group下的聲音都不會被播放
B代表Bypass, 點了之後, 這個Group上所掛的所有特殊音效, 都會被跳過

7.
這裡列出這個Group身上掛了哪些特殊的音效處理
預設一定會掛的是Attenuation, 這個effect只負責調整音量

你可以透過下面的Add..按鈕去替Group加上各種的effect
也可以點選Group後, 在Inspector的Add Effect按鈕上進行

8.
截圖的時候, 覺得有必要順便說一下, 所以加了這個部份
這部分是Mixer在Project視窗中會怎樣顯示的示意
稍微對照一下就能明白了, 在工作中我們可以透過Project視窗這樣簡便的顯示
明白Mixer裡頭的一些資訊, 這在寫程式碼的時候會用到

例如:我需要知道這個Mixer現在有哪些狀態(Snapshot)可以切

以上就是整個Audio Mixer的快速瀏覽了
下面來做一些比較可能會用得到的技巧說明

1. Send & Receive
這是兩個比較特殊的成對Effect
Send負責發訊號, Receive負責收訊號
透過一發一收的組合, 我們可以順利將兩個本來不相干的AudioGroup
順利關聯起來

2. Send & Duck Volume
跟Send & Receive差不多, 只是Receive換成了Duck Volume
當我們有需要播放A聲音, 通知B聲音降低自己的音量時
Duck Volume就會成為一個有用的自動機制

和其他Effect可以透過Send & Receive進行連接有一點比較不同的是
Duck Volume會自動去降他目前掛載的Group的音量
不像我們圖中EchoEff那樣, 可以獨立寫成一個Group
這點在使用上是個盲點

3. 如何在程式中取得AudioMixer的控制權?
一般我會找個有掛載該Mixer任意Group的AudioSource
例如:
假設我有個名叫Audio的GameObject在Hierarchy上
這樣寫我可以拿到AudioGroup
GameObject.Find("Audio").GetComponent<AudioSource>().outputAudioMixerGroup
拿到以後我可以透過.audioMixer進一步取得Audio

不要使用Resources去讀取AudioMixer, 你會找錯個類別實體

4. 如何切換Snapshot?
一般有兩個選擇, 一是從AudioMixer一是從AudioMixerSnapeshot

以下假設已經有Find好的AudioMixer名為mixer
第一種做法:
mixer.TransitionToSnapshots();
第二種做法:
mixer.FindSnapshot("xxx").TransitionTo(0.01f);

第一種做法
可以讓你同時將幾組的Snapshot狀態以比重去進行混合
第二種方法
可以讓你將mixer從你指定的Snapshot在指定時間內, 漸變為另一個指定的Snapshot

5. 如何存取已經被Expose出來的變數?
現在我假設master這個Group的Attenuation上面的Volume已經被暴露出來
並且命名為sysVolume, 而我有個已經Find好的AudioMixer命名為mixer

這樣可以取值
float temp;
mixer.GetFloat("sysVolume", out temp);

這樣可以設值
mixer.SetFloat("sysVolume", 1f);

這兩個函式的返回值都是個bool
true代表有找到這個變數, false代表沒找到這個變數

如果你需要讓數值回到當前Snapshot的預設值
可以使用mixer.ClearFloat("sysVolume");

請特別注意:
一但你動手用程式碼去改變mixer的變數
則Snapshot的切換會失效

如果要保持Snapshot切換的功能正確運作
請在切換前利用ClearFloat將數值重設過

6. 如何製作自己的Effect?
這篇文章中, 從他的示範影片可以看到大量他自製的Effect
這表示Unity是有開放讓使用者自己設計Effect的
不過由於開發方式有點複雜, 所以有興趣的朋友
請自行透過這篇文章進行深入了解
開發會需要有C++和聲音相關的知識

3 則留言:

  1. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 雖然你已經刪除留言, 不過我還是回一下@@
      我用5.4.0f3測試了一下, 這部分功能在該版本下並無故障情形
      Snapshots的參數會在你修改的當下就進行記錄
      且能隨時正確進行切換 :)

      刪除