原文:Unreal Engine 4 Audio Tutorial
作者:Tommy Tran
譯者:Shuchang Liu
在本篇教程中,你將學習如何以不同方法播放3D音效,並通過UI控制音頻音量。
在視頻游戲中,游戲音頻通常指的是音樂,對白和音效。在當前的游戲時代,如果你的游戲項目里沒有音頻,基本就是未經打磨的半成品。
音頻可以增加游戲沉浸感。音樂能激起玩家的情緒反應,對白刻畫了角色,推進了故事發展,音效提供了反饋和可信度。這些元素促使一款好游戲變成一款優秀的游戲。
在本篇教程,你將學習:
- 播放音樂並使之循環
- 在動畫特定節點播放音效
- 每次播放音頻前調整音調
- 根據3D位置空間調整音量
- 通過UI分別控制音樂和音效音量
請注意,本篇教程涉及藍圖部分內容。如果你需要復習有關內容,請查看藍圖教程。
此外推薦你帶上耳機學習實踐本篇教程內容,因為其中涉及立體音頻的內容。
注意:本篇教程只是Unreal Engine 4系列教程的其中一篇:
起步入門
下載示例項目並解壓。進入項目文件夾,雙擊SkywardMuffin.uproject打開項目。
按下Play可以運行游戲。游戲玩法是盡可能踩着天空雲朵往上跳躍,同時避免掉落地面,點擊左鍵跳躍地面。

很解壓的小游戲,對吧?為了強化放松解壓的感覺,我們首先要播放一些寧靜的鋼琴曲。
播放音樂
在Content Browser打開Audio文件夾,這里有本篇教程要用到的所有聲音資源。你可以通過在鼠標懸浮在圖標上並點擊播放圖標進行試聽。

要實現播放音樂非常簡單,只要將音頻資源拖拽到Viewport就行了。然而,這樣音樂只會播放一遍,我們必須手動設置音頻資源的循環播放。雙擊打開S_Music。

會彈出一個帶有簡單Details設置的窗口,在Sound Wave部分設置勾選Looping設置。

接着,回到主編輯器將S_Music拖拽至Viewport。

這樣關卡場景就會創建出一個帶有S_Music音源的AmbientSound Actor,這個Actor會在游戲運行時播放S_Music。

接着,我們要在蘑菇小人每次移動時播放一個音效,要實現這點,我們要使用動畫通知(Animation Notify)。
什么是動畫通知?
動畫通知可以在動畫的特定節點觸發指定事件,我們可以用它在實現很多功能。比如,創建一個動畫通知來生成粒子特效。

在游戲中,重玩按鈕會在蘑菇小人掉落地面時彈出來,利用動畫通知,我們就可以改為在死亡動畫結束后再彈出按鈕。

在本篇教程中,我們將利用動畫通知,實現蘑菇小人每次邁步走路時播放音效。
創建動畫通知
打開Characters\Muffin文件夾雙擊打開SK_Muffin_Walk,可以打開動畫編輯器。
在Viewport下面的面板,我們能看到名為Notifies的區域。亮灰色區域稱之為通知軌道(Notify Track)。我們可以在這里創建管理通知。

左右腳觸地的時刻分別是第10幀和第22幀,所以我們要分別在這兩個節點上創建通知。在通知軌道上點擊右鍵,從彈出菜單中選擇Add Notify\Play Sound,創建名為PlaySound的通知。

接着,我們需要將通知位置調整到第10幀處。
移動動畫通知
要想直接將通知移動到第10幀的位置會有點難度,因為我們不知道它的具體位置。然而,我們可以通過在時間軸調整播放進度條的位置來做位置參考。
首先,時間軸處於面板的底部。在暫停動畫播放后,拖拽紅色的播放進度條到Current Frame為10的位置。

現在,通知軌道上就會有點紅色指示線用於標記當前播放位置。

拖拽PlaySound通知到紅色指示線處。

接着,我們要讓通知能控制播放腳步聲。
播放腳步聲
左鍵選中PlaySound,然后再Details面板的Anim Notify設置處,設置Sound為S_Footstep。

如法炮制設置另一只腳的腳步聲。按照如下操作:
- 創建另一個Play Sound通知
- 將通知調整到第21幀位置
- 將通知的Sound設置成S_Footstep。

現在,只要步行動畫播放到第10幀和第22幀,就會觸發通知播放S_Footstep。
關閉SK_Muffin_Walk回到主編輯器,按下Play運行游戲,四處走動停下腳步聲吧。

仔細聽聽腳步聲,你可以會注意到一些細節。雙腿邁步的音效是一模一樣的!如果有辦法讓音效每次播放時都有些變化就好了。
在教程下一部分,我們將實現當角色碰到雲朵時播放音效。這一次,我們會使用Sound Cue來動態調整音效。
什么是Sound Cue?
Sound Cue是一種控制多個音效並進行合成播放的資源,我們可以將一個正常的音頻資源制作成Sound Cue。項目的每個音效資源,也都能單獨包裝制作成Sound Cue類型資源來進行播放。
下面例子是用Concatenator節點將3個音頻資源合成一個Sound Cue來按順序播放:

如果改成用Random節點,播放Sound Cue的效果就是從3個音頻中隨機一個進行播放。

在本篇教程里,我們將創建一個Sound Cue並控制它的音調。
創建Sound Cue
首先,回到Audio文件夾,我們要將S_Pop包裝制作成Sound Cue,通過右鍵點擊S_Pop,在彈出菜單中選擇Create Cue進行創建。

這樣會創建出名為S_Pop_Cue的新資源,雙擊S_Pop_Cue打開Sound Cue編輯器。

注意:編輯器外觀跟材質編輯器外觀非常相似,在此不再贅述。如果你還不熟悉材質編輯器,請查看入門教程。
在圖表中,我們可以看到兩個節點:Wave Player:S_Pop和Output。Sound Cue會播放任何與Output節點相連的音效(在本例里,它會播放S_Pop)。你可以通過在Toolbar上點擊Play Cue來試聽。

接着,我們要試着修改它的音調。
修改聲音音調
為了修改聲音的音調,我們需要用到Modulator節點。創建節點並如下圖進行連接:

現在就可以修改音調了。選中Modulator節點,在Details面板可以看到兩個相關字段:Pitch Min和Pitch Max。數值如果低於1,說明音調可以變低,反之亦然。數值為1說明保持聲音原本的音調。
在本例中,我們只會調高聲音音調,因此將Pitch Min設為1.0,Pitch Max設為2.0。

現在,每次播放Sound Cue時,聲音音調都會隨機在原音調和原音調的兩倍之間。
播放Sound Cue
回到主編輯器,打開Blueprints文件夾。打開BP_Cloud並點進CloudTouched函數里。該函數在玩家碰到雲朵時就會調用,很適合在此時播放Sound Cue。
有以下兩種節點都適合用來播放聲音:
-
Play Sound 2D:不考慮衰減和空間定位進行聲音播放(關於這兩個概念等下講解)。該節點適合用於播放不是從游戲世界中產生的聲音,比如背景音樂和UI音效。
-
Play Sound at Location:指定3D空間位置作為音源進行聲音播放。該節點適合用於模擬聲音從某個位置某個方向傳出的效果。
由於雲朵是游戲世界里的具體實體,聲音理所當然要從實體中傳出來才顯得逼真。因此我們在節點末端添加Play Sound at Location節點。

隨后,將Sound設置為S_Pop_Cue。

點擊Compile並返回主編輯器,按下Play運行游戲,每次碰到運動,你應該都能聽到不同的音調聲音。

現在聲音有了高低音效之分了,但聽起來沒有什么立體效果。要實現這點,我們需要將聲音空間化(spatialize)。
什么是空間定位(Spatialization)?
空間定位是一種讓聲音聽起來處於3D空間的處理手段。聲音如果從左邊傳來,那左邊的耳機聲音會更清楚,反之亦然。

除了能增強沉浸感,空間定位還能完善游戲玩法。像守望先鋒和反恐精英等競技游戲中,立體聲效可以讓玩家敏銳地感知對手的位置。
在本篇教程中,我們會對某些雲朵音效啟用空間定位。
啟用空間定位
有以下兩種方法對Sound Cue啟用空間定位:
- Sound Attenuation資源:這種資源帶有衰減和空間定位設置。你可以給不同的聲音指定相同的Sound Attenuation資源以確保設置一致。
- Override Attenuation:除了使用Sound Attenuation資源,你也可以通過Override Attenuation選項設置具體Sound Cue的聲音設置。
在本例中,我們將使用第二種方法。打開S_Pop_Cue,在Details面板的Attenuation設置處勾選Override Attenuation,這樣可以啟用Attenuation Overrides部分設置。

我們可以觀察Attenuation Overrides處的箭頭是否可點判斷空間定位是否啟用。Spatialize設置表明聲音是否會衰減。

如上圖進行設置然后關閉S_Pop_Cue。接着,我們要指定聲音的3D空間位置。
在指定3D空間播放聲音
打開BP_Cloud並創建GetActorLocation節點,隨后將其與Play Sound at Location節點的Location引腳相連。

這樣聲音就會在雲朵的位置播放出來。
點擊Compile並返回主編輯器。按下Play運行游戲,操控小人觸碰雲朵,你可以感覺到聲音是從不同的地方傳來的。

注意:默認情況下攝像機就是音頻監聽者(audio listener)。這意味着我們是以攝像機的視角去聽那些聲音的。如果你想修改監聽者對應的Actor,可以使用Set Audio Listener Override節點。
你可能注意到了有些雲是會下雨的,如果它沒有對應的下雨聲那就不真實了!接着,我們要為其添加雨聲,並啟用衰減(attenuation)來聲音產生遠近變化。
添加雨聲
與其使用節點播放雨聲,我們可以使用Audio組件。使用組件的一大優點就是它能在雲的位置自動播放。
打開BP_Cloud,在Components面板添加Audio組件,將其命名為RainAudio。
選中組件,在Details面板找到Sound設置,將Sound設為S_Rain。

普通雲朵不應該播放雨聲,即普通雲朵要禁用RainAudio組件,我們在Details面板找到Activation設置並取消勾選Auto Activate。

雨雲則要啟用RainAudio組件,我們可以在EnableRain函數做這件事,只有雨雲實例才會執行該函數。打開EnableRain函數並添加如下高亮節點:

接着,我們需要啟用並設置衰減。
設置衰減
在Components面板選中RainAudio,在Details面板找到Attenuation設置,啟用Override Attenuation。
衰減設置確定了空間距離與聲音衰減的比例關系。在Attenuation Overrides設置里,可以修改以下兩個參數:
-
Radius(半徑):聲音開始衰減的最遠距離
-
Falloff Distance(衰減距離):聲音衰減至靜默的距離,這個距離從Radius往外開始算起。
看看如下例子:

當玩家處於內圓半徑時(取決於Radius),音量為100%。當玩家從內圓走向外圓邊緣時,音量會逐漸衰減至0%。
對於本篇教程,我們將Radius設為300,FalloffDistance設為400。

這代表玩家在距離300單位內,音量是100%的,當玩家距離逐漸接近700(300 + 400)單位時,音量減至0%。
有時當雲朵從屏幕中移除了,但玩家還未離開聲音衰減范圍內的情況下,聲音會被突然切斷。為了解決這個問題,我們給音效加上漸隱效果。
漸隱音效
切換到Event Graph並找到FadeOut事件。我們可以通過在My Blueprint面板找到Graphs部分設置,雙擊EventGraph列表下的FadeOut。
在節點末端添加如下高亮節點:

FadeOut節點會在玩家觸碰雲朵時觸發執行,Timeline (FadeTimeline)節點的Alpha字段會在一段時間內輸出從1到0。通過這個數值來控制RainAudio漸隱。
注意:你可以雙擊Timeline節點打開頁簽查看節點是否能正常工作。想了解更多關於Timelines的內容,請查看官方文檔。
接着我們還需要干一件事才能聽到S_Rain。當聲音的音量降到0%時,它會停止播放。由於在游戲中,一開始我們很可能處於聲音的衰減距離外,S_Rain自然就會降至0%。當我們再次進入衰減距離內時,由於聲音已停止播放,就不會聽到任何東西了。

我們可以通過Virtualize when Silent修正這一點,啟用該設置可以保證無論音量大小,聲音始終處於播放狀態。
點擊Compile並關閉BP_Cloud,打開Audio文件夾並打開S_Rain,在Sound設置處啟用Virtualize when Silent。

現在,S_Rain即使處於靜音狀態也會始終播放。關閉S_Rain並返回主編輯器,按下Play運行游戲,控制小人接近雨聲的有效范圍內聽聽效果吧。

在教程最后一部分,我們將會通過Sound Classes(聲音類)和Sound Mixes(混音)控制聲音音量。
Sound Classes(聲音類)和Sound Mixes(混音)
用聲音類可以簡便地將多個聲音組織起來。比如,你可以將所有音樂組織成一個聲音類,所有音效組織成另一個類。

為了能在游戲過程中調整聲音類的參數(音量,音調等),我們可以使用混音。混音本質是一張表格,表格每行的表頭就是聲音類。每行數據都表示該行聲音類的參數調整。
下圖說明了一個混音所包含的數據:

使用了上述的混音,Music聲音類的所有聲音都會以原本音量的一半來播放。Effect的聲音則原本音調的兩倍進行播放。
現在,讓我們來着手創建聲音類。
創建聲音類
在本篇教程,我們將分別調整聲音和音效的音量。這意味着我們需要兩個聲音類。在Content Browser里,點擊Add New並選擇Sounds\Sound Class,將其重命名為S_Music_Class。
再創建另一個聲音類命名為S_Effects_Class。

接着,我們需要指定每個聲音的聲音類。首先對音樂資源進行設置。打開S_Music,在Sound設置處將Sound Class修改為S_Music_Class。

做好以上設置后,就關閉S_Music。
接着要設置音效資源。與其一個個指定聲音類,我們全選以下資源:
- S_Footstep
- S_Pop_Cue
- S_Rain
隨后,右鍵點擊選中資源,選中Asset Actions\Bulk Edit via Property Matrix,這樣就能打開屬性矩陣編輯器並看到以上資源。

通過編輯器我們可以同時編輯選中資源的通用屬性。
在Details面板展開Sound分支,點擊Sound Class右側的網格圖標。

選擇S_Effects_Class,然后關閉屬性矩陣編輯器。
就此所有的音頻都設置好聲音類了,接着,我們要創建混音,並通過藍圖來控制調整它。
創建並調整混音
在Content Browser里,點擊Add New並選中Sounds\Sound Mix,將新建混音命名為S_Volume_Mix。
我們可以通過滑條控制每個聲音類的音量,項目里已經提前創建好了滑條資源,找到UI文件夾並打開WBP_Options。

為了實現音量調節,我們需要獲取滑條數值並傳給混音。我們首先實現音樂音量控制。
將編輯器切換成Graph模式,並在My Blueprints面板找到Variables設置,選中MusicSlider,然后在Details面板點擊On Value Changed旁邊的按鈕。

這樣圖表就會創建一個On Value Changed (MusicSlider)事件,每次滑動滑條時,事件都會觸發執行。

現在,我們需要設置S_Volume_Mix里的S_Music_Class聲音類的音量。這里要利用Set Sound Mix Class Override節點,該節點允許我們指定一個混音和一個聲音類。如果混音里不存在指定聲音類,它會自動將其添加進去。如果已存在,則更新對應的聲音類。
添加Set Sound Mix Class Override節點,並做如下設置:
- In Sound Mix Modifier: S_Volume_Mix
- In Sound Class: S_Music_Class
- Fade in Time: 0(確保音量修改即時生效)

接着,如下連接節點:

如法炮制設置EffectsSlider,將In Sound Class引腳修改為S_Effects_Class。

現在,只要滑條數值發生變動,S_Volume_Mix就會修改相關聲音類的音量。
最后我們還要激活對應混音,才能讓這一切運作起來。
激活混音
對本例而言(用UI控制音量),最好是在游戲一開始激活混音。這樣聲音類一開始就能用上混音設置。然而,簡單起見,本例中我們還是在控件中激活混音。
創建Event Pre Construct節點,這個節點跟藍圖的Event BeginPlay節點非常相似。

為了激活混音,我們要使用Push Sound Mix Modifier節點,創建對應節點並與Event Pre Construct相連,隨后設置In Sound Mix Modifier為S_Volume_Mix。

這樣在WBP_Options生成時就能激活S_Volume_Mix。
點擊Compile並關閉WBP_Options。按下Play運行游戲,點擊M鍵彈出滑條,調整滑條感受音量的變化吧。

后續學習
你可以在這里下載完整項目。
如你所見,在Unreal Engine 4里使用音頻非常簡單。如果你想了解更多關於音頻系統的內容,點擊查閱官方文檔。你還可以實現像混響或EQ這樣炫酷的效果,記得也關注下即將推出的全新音頻引擎。
如果你還想繼續學習引擎其他內容,點擊下篇教程,將講解有關粒子特效的內容。