原文:Unreal Engine 4 Audio Tutorial
作者:Tommy Tran
譯者:Shuchang Liu
在本篇教程中,你將學(xué)習(xí)如何以不同方法播放3D音效,并通過(guò)UI控制音頻音量。
在視頻游戲中,游戲音頻通常指的是音樂(lè),對(duì)白和音效。在當(dāng)前的游戲時(shí)代,如果你的游戲項(xiàng)目里沒(méi)有音頻,基本就是未經(jīng)打磨的半成品。
音頻可以增加游戲沉浸感。音樂(lè)能激起玩家的情緒反應(yīng),對(duì)白刻畫(huà)了角色,推進(jìn)了故事發(fā)展,音效提供了反饋和可信度。這些元素促使一款好游戲變成一款優(yōu)秀的游戲。
在本篇教程,你將學(xué)習(xí):
- 播放音樂(lè)并使之循環(huán)
- 在動(dòng)畫(huà)特定節(jié)點(diǎn)播放音效
- 每次播放音頻前調(diào)整音調(diào)
- 根據(jù)3D位置空間調(diào)整音量
- 通過(guò)UI分別控制音樂(lè)和音效音量
請(qǐng)注意,本篇教程涉及藍(lán)圖部分內(nèi)容。如果你需要復(fù)習(xí)有關(guān)內(nèi)容,請(qǐng)查看藍(lán)圖教程。
此外推薦你帶上耳機(jī)學(xué)習(xí)實(shí)踐本篇教程內(nèi)容,因?yàn)槠渲猩婕傲Ⅲw音頻的內(nèi)容。
注意:本篇教程只是Unreal Engine 4系列教程的其中一篇:
- Part 1:入門
- Part 2:藍(lán)圖
- Part 3:材質(zhì)
- Part 4:UI
- Part 5:制作簡(jiǎn)單游戲
- Part 6:動(dòng)畫(huà)
- Part 7:音頻
- Part 8:粒子系統(tǒng)
- Part 9:AI
- Part 10:制作簡(jiǎn)單FPS游戲
起步入門
下載示例項(xiàng)目并解壓。進(jìn)入項(xiàng)目文件夾,雙擊SkywardMuffin.uproject打開(kāi)項(xiàng)目。
按下Play可以運(yùn)行游戲。游戲玩法是盡可能踩著天空云朵往上跳躍,同時(shí)避免掉落地面,點(diǎn)擊左鍵跳躍地面。
很解壓的小游戲,對(duì)吧?為了強(qiáng)化放松解壓的感覺(jué),我們首先要播放一些寧?kù)o的鋼琴曲。
播放音樂(lè)
在Content Browser打開(kāi)Audio文件夾,這里有本篇教程要用到的所有聲音資源。你可以通過(guò)在鼠標(biāo)懸浮在圖標(biāo)上并點(diǎn)擊播放圖標(biāo)進(jìn)行試聽(tīng)。
要實(shí)現(xiàn)播放音樂(lè)非常簡(jiǎn)單,只要將音頻資源拖拽到Viewport就行了。然而,這樣音樂(lè)只會(huì)播放一遍,我們必須手動(dòng)設(shè)置音頻資源的循環(huán)播放。雙擊打開(kāi)S_Music。
會(huì)彈出一個(gè)帶有簡(jiǎn)單Details設(shè)置的窗口,在Sound Wave部分設(shè)置勾選Looping設(shè)置。
接著,回到主編輯器將S_Music拖拽至Viewport。
這樣關(guān)卡場(chǎng)景就會(huì)創(chuàng)建出一個(gè)帶有S_Music音源的AmbientSound Actor,這個(gè)Actor會(huì)在游戲運(yùn)行時(shí)播放S_Music。
接著,我們要在蘑菇小人每次移動(dòng)時(shí)播放一個(gè)音效,要實(shí)現(xiàn)這點(diǎn),我們要使用動(dòng)畫(huà)通知(Animation Notify)。
什么是動(dòng)畫(huà)通知?
動(dòng)畫(huà)通知可以在動(dòng)畫(huà)的特定節(jié)點(diǎn)觸發(fā)指定事件,我們可以用它在實(shí)現(xiàn)很多功能。比如,創(chuàng)建一個(gè)動(dòng)畫(huà)通知來(lái)生成粒子特效。
在游戲中,重玩按鈕會(huì)在蘑菇小人掉落地面時(shí)彈出來(lái),利用動(dòng)畫(huà)通知,我們就可以改為在死亡動(dòng)畫(huà)結(jié)束后再?gòu)棾霭粹o。
在本篇教程中,我們將利用動(dòng)畫(huà)通知,實(shí)現(xiàn)蘑菇小人每次邁步走路時(shí)播放音效。
創(chuàng)建動(dòng)畫(huà)通知
打開(kāi)Characters\Muffin文件夾雙擊打開(kāi)SK_Muffin_Walk,可以打開(kāi)動(dòng)畫(huà)編輯器。
在Viewport下面的面板,我們能看到名為Notifies的區(qū)域。亮灰色區(qū)域稱之為通知軌道(Notify Track)。我們可以在這里創(chuàng)建管理通知。
左右腳觸地的時(shí)刻分別是第10幀和第22幀,所以我們要分別在這兩個(gè)節(jié)點(diǎn)上創(chuàng)建通知。在通知軌道上點(diǎn)擊右鍵,從彈出菜單中選擇Add Notify\Play Sound,創(chuàng)建名為PlaySound的通知。
接著,我們需要將通知位置調(diào)整到第10幀處。
移動(dòng)動(dòng)畫(huà)通知
要想直接將通知移動(dòng)到第10幀的位置會(huì)有點(diǎn)難度,因?yàn)槲覀儾恢浪木唧w位置。然而,我們可以通過(guò)在時(shí)間軸調(diào)整播放進(jìn)度條的位置來(lái)做位置參考。
首先,時(shí)間軸處于面板的底部。在暫停動(dòng)畫(huà)播放后,拖拽紅色的播放進(jìn)度條到Current Frame為10的位置。
現(xiàn)在,通知軌道上就會(huì)有點(diǎn)紅色指示線用于標(biāo)記當(dāng)前播放位置。
拖拽PlaySound通知到紅色指示線處。
接著,我們要讓通知能控制播放腳步聲。
播放腳步聲
左鍵選中PlaySound,然后再Details面板的Anim Notify設(shè)置處,設(shè)置Sound為S_Footstep。
如法炮制設(shè)置另一只腳的腳步聲。按照如下操作:
- 創(chuàng)建另一個(gè)Play Sound通知
- 將通知調(diào)整到第21幀位置
- 將通知的Sound設(shè)置成S_Footstep。
現(xiàn)在,只要步行動(dòng)畫(huà)播放到第10幀和第22幀,就會(huì)觸發(fā)通知播放S_Footstep。
關(guān)閉SK_Muffin_Walk回到主編輯器,按下Play運(yùn)行游戲,四處走動(dòng)停下腳步聲吧。
仔細(xì)聽(tīng)聽(tīng)腳步聲,你可以會(huì)注意到一些細(xì)節(jié)。雙腿邁步的音效是一模一樣的!如果有辦法讓音效每次播放時(shí)都有些變化就好了。
在教程下一部分,我們將實(shí)現(xiàn)當(dāng)角色碰到云朵時(shí)播放音效。這一次,我們會(huì)使用Sound Cue來(lái)動(dòng)態(tài)調(diào)整音效。
什么是Sound Cue?
Sound Cue是一種控制多個(gè)音效并進(jìn)行合成播放的資源,我們可以將一個(gè)正常的音頻資源制作成Sound Cue。項(xiàng)目的每個(gè)音效資源,也都能單獨(dú)包裝制作成Sound Cue類型資源來(lái)進(jìn)行播放。
下面例子是用Concatenator節(jié)點(diǎn)將3個(gè)音頻資源合成一個(gè)Sound Cue來(lái)按順序播放:
如果改成用Random節(jié)點(diǎn),播放Sound Cue的效果就是從3個(gè)音頻中隨機(jī)一個(gè)進(jìn)行播放。
在本篇教程里,我們將創(chuàng)建一個(gè)Sound Cue并控制它的音調(diào)。
創(chuàng)建Sound Cue
首先,回到Audio文件夾,我們要將S_Pop包裝制作成Sound Cue,通過(guò)右鍵點(diǎn)擊S_Pop,在彈出菜單中選擇Create Cue進(jìn)行創(chuàng)建。
這樣會(huì)創(chuàng)建出名為S_Pop_Cue的新資源,雙擊S_Pop_Cue打開(kāi)Sound Cue編輯器。
注意:編輯器外觀跟材質(zhì)編輯器外觀非常相似,在此不再贅述。如果你還不熟悉材質(zhì)編輯器,請(qǐng)查看入門教程。
在圖表中,我們可以看到兩個(gè)節(jié)點(diǎn):Wave Player:S_Pop和Output。Sound Cue會(huì)播放任何與Output節(jié)點(diǎn)相連的音效(在本例里,它會(huì)播放S_Pop)。你可以通過(guò)在Toolbar上點(diǎn)擊Play Cue來(lái)試聽(tīng)。
接著,我們要試著修改它的音調(diào)。
修改聲音音調(diào)
為了修改聲音的音調(diào),我們需要用到Modulator節(jié)點(diǎn)。創(chuàng)建節(jié)點(diǎn)并如下圖進(jìn)行連接:
現(xiàn)在就可以修改音調(diào)了。選中Modulator節(jié)點(diǎn),在Details面板可以看到兩個(gè)相關(guān)字段:Pitch Min和Pitch Max。數(shù)值如果低于1,說(shuō)明音調(diào)可以變低,反之亦然。數(shù)值為1說(shuō)明保持聲音原本的音調(diào)。
在本例中,我們只會(huì)調(diào)高聲音音調(diào),因此將Pitch Min設(shè)為1.0,Pitch Max設(shè)為2.0。
現(xiàn)在,每次播放Sound Cue時(shí),聲音音調(diào)都會(huì)隨機(jī)在原音調(diào)和原音調(diào)的兩倍之間。
播放Sound Cue
回到主編輯器,打開(kāi)Blueprints文件夾。打開(kāi)BP_Cloud并點(diǎn)進(jìn)CloudTouched函數(shù)里。該函數(shù)在玩家碰到云朵時(shí)就會(huì)調(diào)用,很適合在此時(shí)播放Sound Cue。
有以下兩種節(jié)點(diǎn)都適合用來(lái)播放聲音:
Play Sound 2D:不考慮衰減和空間定位進(jìn)行聲音播放(關(guān)于這兩個(gè)概念等下講解)。該節(jié)點(diǎn)適合用于播放不是從游戲世界中產(chǎn)生的聲音,比如背景音樂(lè)和UI音效。
Play Sound at Location:指定3D空間位置作為音源進(jìn)行聲音播放。該節(jié)點(diǎn)適合用于模擬聲音從某個(gè)位置某個(gè)方向傳出的效果。
由于云朵是游戲世界里的具體實(shí)體,聲音理所當(dāng)然要從實(shí)體中傳出來(lái)才顯得逼真。因此我們?cè)诠?jié)點(diǎn)末端添加Play Sound at Location節(jié)點(diǎn)。
隨后,將Sound設(shè)置為S_Pop_Cue。
點(diǎn)擊Compile并返回主編輯器,按下Play運(yùn)行游戲,每次碰到運(yùn)動(dòng),你應(yīng)該都能聽(tīng)到不同的音調(diào)聲音。
現(xiàn)在聲音有了高低音效之分了,但聽(tīng)起來(lái)沒(méi)有什么立體效果。要實(shí)現(xiàn)這點(diǎn),我們需要將聲音空間化(spatialize)。
什么是空間定位(Spatialization)?
空間定位是一種讓聲音聽(tīng)起來(lái)處于3D空間的處理手段。聲音如果從左邊傳來(lái),那左邊的耳機(jī)聲音會(huì)更清楚,反之亦然。
除了能增強(qiáng)沉浸感,空間定位還能完善游戲玩法。像守望先鋒和反恐精英等競(jìng)技游戲中,立體聲效可以讓玩家敏銳地感知對(duì)手的位置。
在本篇教程中,我們會(huì)對(duì)某些云朵音效啟用空間定位。
啟用空間定位
有以下兩種方法對(duì)Sound Cue啟用空間定位:
- Sound Attenuation資源:這種資源帶有衰減和空間定位設(shè)置。你可以給不同的聲音指定相同的Sound Attenuation資源以確保設(shè)置一致。
- Override Attenuation:除了使用Sound Attenuation資源,你也可以通過(guò)Override Attenuation選項(xiàng)設(shè)置具體Sound Cue的聲音設(shè)置。
在本例中,我們將使用第二種方法。打開(kāi)S_Pop_Cue,在Details面板的Attenuation設(shè)置處勾選Override Attenuation,這樣可以啟用Attenuation Overrides部分設(shè)置。
我們可以觀察Attenuation Overrides處的箭頭是否可點(diǎn)判斷空間定位是否啟用。Spatialize設(shè)置表明聲音是否會(huì)衰減。
如上圖進(jìn)行設(shè)置然后關(guān)閉S_Pop_Cue。接著,我們要指定聲音的3D空間位置。
在指定3D空間播放聲音
打開(kāi)BP_Cloud并創(chuàng)建GetActorLocation節(jié)點(diǎn),隨后將其與Play Sound at Location節(jié)點(diǎn)的Location引腳相連。
這樣聲音就會(huì)在云朵的位置播放出來(lái)。
點(diǎn)擊Compile并返回主編輯器。按下Play運(yùn)行游戲,操控小人觸碰云朵,你可以感覺(jué)到聲音是從不同的地方傳來(lái)的。
注意:默認(rèn)情況下攝像機(jī)就是音頻監(jiān)聽(tīng)者(audio listener)。這意味著我們是以攝像機(jī)的視角去聽(tīng)那些聲音的。如果你想修改監(jiān)聽(tīng)者對(duì)應(yīng)的Actor,可以使用Set Audio Listener Override節(jié)點(diǎn)。
你可能注意到了有些云是會(huì)下雨的,如果它沒(méi)有對(duì)應(yīng)的下雨聲那就不真實(shí)了!接著,我們要為其添加雨聲,并啟用衰減(attenuation)來(lái)聲音產(chǎn)生遠(yuǎn)近變化。
添加雨聲
與其使用節(jié)點(diǎn)播放雨聲,我們可以使用Audio組件。使用組件的一大優(yōu)點(diǎn)就是它能在云的位置自動(dòng)播放。
打開(kāi)BP_Cloud,在Components面板添加Audio組件,將其命名為RainAudio。
選中組件,在Details面板找到Sound設(shè)置,將Sound設(shè)為S_Rain。
普通云朵不應(yīng)該播放雨聲,即普通云朵要禁用RainAudio組件,我們?cè)贒etails面板找到Activation設(shè)置并取消勾選Auto Activate。
雨云則要啟用RainAudio組件,我們可以在EnableRain函數(shù)做這件事,只有雨云實(shí)例才會(huì)執(zhí)行該函數(shù)。打開(kāi)EnableRain函數(shù)并添加如下高亮節(jié)點(diǎn):
接著,我們需要啟用并設(shè)置衰減。
設(shè)置衰減
在Components面板選中RainAudio,在Details面板找到Attenuation設(shè)置,啟用Override Attenuation。
衰減設(shè)置確定了空間距離與聲音衰減的比例關(guān)系。在Attenuation Overrides設(shè)置里,可以修改以下兩個(gè)參數(shù):
Radius(半徑):聲音開(kāi)始衰減的最遠(yuǎn)距離
Falloff Distance(衰減距離):聲音衰減至靜默的距離,這個(gè)距離從Radius往外開(kāi)始算起。
看看如下例子:
當(dāng)玩家處于內(nèi)圓半徑時(shí)(取決于Radius),音量為100%。當(dāng)玩家從內(nèi)圓走向外圓邊緣時(shí),音量會(huì)逐漸衰減至0%。
對(duì)于本篇教程,我們將Radius設(shè)為300,FalloffDistance設(shè)為400。
這代表玩家在距離300單位內(nèi),音量是100%的,當(dāng)玩家距離逐漸接近700(300 + 400)單位時(shí),音量減至0%。
有時(shí)當(dāng)云朵從屏幕中移除了,但玩家還未離開(kāi)聲音衰減范圍內(nèi)的情況下,聲音會(huì)被突然切斷。為了解決這個(gè)問(wèn)題,我們給音效加上漸隱效果。
漸隱音效
切換到Event Graph并找到FadeOut事件。我們可以通過(guò)在My Blueprint面板找到Graphs部分設(shè)置,雙擊EventGraph列表下的FadeOut。
在節(jié)點(diǎn)末端添加如下高亮節(jié)點(diǎn):
FadeOut節(jié)點(diǎn)會(huì)在玩家觸碰云朵時(shí)觸發(fā)執(zhí)行,Timeline (FadeTimeline)節(jié)點(diǎn)的Alpha字段會(huì)在一段時(shí)間內(nèi)輸出從1到0。通過(guò)這個(gè)數(shù)值來(lái)控制RainAudio漸隱。
注意:你可以雙擊Timeline節(jié)點(diǎn)打開(kāi)頁(yè)簽查看節(jié)點(diǎn)是否能正常工作。想了解更多關(guān)于Timelines的內(nèi)容,請(qǐng)查看官方文檔。
接著我們還需要干一件事才能聽(tīng)到S_Rain。當(dāng)聲音的音量降到0%時(shí),它會(huì)停止播放。由于在游戲中,一開(kāi)始我們很可能處于聲音的衰減距離外,S_Rain自然就會(huì)降至0%。當(dāng)我們?cè)俅芜M(jìn)入衰減距離內(nèi)時(shí),由于聲音已停止播放,就不會(huì)聽(tīng)到任何東西了。
我們可以通過(guò)Virtualize when Silent修正這一點(diǎn),啟用該設(shè)置可以保證無(wú)論音量大小,聲音始終處于播放狀態(tài)。
點(diǎn)擊Compile并關(guān)閉BP_Cloud,打開(kāi)Audio文件夾并打開(kāi)S_Rain,在Sound設(shè)置處啟用Virtualize when Silent。
現(xiàn)在,S_Rain即使處于靜音狀態(tài)也會(huì)始終播放。關(guān)閉S_Rain并返回主編輯器,按下Play運(yùn)行游戲,控制小人接近雨聲的有效范圍內(nèi)聽(tīng)聽(tīng)效果吧。
在教程最后一部分,我們將會(huì)通過(guò)Sound Classes(聲音類)和Sound Mixes(混音)控制聲音音量。
Sound Classes(聲音類)和Sound Mixes(混音)
用聲音類可以簡(jiǎn)便地將多個(gè)聲音組織起來(lái)。比如,你可以將所有音樂(lè)組織成一個(gè)聲音類,所有音效組織成另一個(gè)類。
為了能在游戲過(guò)程中調(diào)整聲音類的參數(shù)(音量,音調(diào)等),我們可以使用混音。混音本質(zhì)是一張表格,表格每行的表頭就是聲音類。每行數(shù)據(jù)都表示該行聲音類的參數(shù)調(diào)整。
下圖說(shuō)明了一個(gè)混音所包含的數(shù)據(jù):
使用了上述的混音,Music聲音類的所有聲音都會(huì)以原本音量的一半來(lái)播放。Effect的聲音則原本音調(diào)的兩倍進(jìn)行播放。
現(xiàn)在,讓我們來(lái)著手創(chuàng)建聲音類。
創(chuàng)建聲音類
在本篇教程,我們將分別調(diào)整聲音和音效的音量。這意味著我們需要兩個(gè)聲音類。在Content Browser里,點(diǎn)擊Add New并選擇Sounds\Sound Class,將其重命名為S_Music_Class。
再創(chuàng)建另一個(gè)聲音類命名為S_Effects_Class。
接著,我們需要指定每個(gè)聲音的聲音類。首先對(duì)音樂(lè)資源進(jìn)行設(shè)置。打開(kāi)S_Music,在Sound設(shè)置處將Sound Class修改為S_Music_Class。
做好以上設(shè)置后,就關(guān)閉S_Music。
接著要設(shè)置音效資源。與其一個(gè)個(gè)指定聲音類,我們?nèi)x以下資源:
- S_Footstep
- S_Pop_Cue
- S_Rain
隨后,右鍵點(diǎn)擊選中資源,選中Asset Actions\Bulk Edit via Property Matrix,這樣就能打開(kāi)屬性矩陣編輯器并看到以上資源。
通過(guò)編輯器我們可以同時(shí)編輯選中資源的通用屬性。
在Details面板展開(kāi)Sound分支,點(diǎn)擊Sound Class右側(cè)的網(wǎng)格圖標(biāo)。
選擇S_Effects_Class,然后關(guān)閉屬性矩陣編輯器。
就此所有的音頻都設(shè)置好聲音類了,接著,我們要?jiǎng)?chuàng)建混音,并通過(guò)藍(lán)圖來(lái)控制調(diào)整它。
創(chuàng)建并調(diào)整混音
在Content Browser里,點(diǎn)擊Add New并選中Sounds\Sound Mix,將新建混音命名為S_Volume_Mix。
我們可以通過(guò)滑條控制每個(gè)聲音類的音量,項(xiàng)目里已經(jīng)提前創(chuàng)建好了滑條資源,找到UI文件夾并打開(kāi)WBP_Options。
為了實(shí)現(xiàn)音量調(diào)節(jié),我們需要獲取滑條數(shù)值并傳給混音。我們首先實(shí)現(xiàn)音樂(lè)音量控制。
將編輯器切換成Graph模式,并在My Blueprints面板找到Variables設(shè)置,選中MusicSlider,然后在Details面板點(diǎn)擊On Value Changed旁邊的按鈕。
這樣圖表就會(huì)創(chuàng)建一個(gè)On Value Changed (MusicSlider)事件,每次滑動(dòng)滑條時(shí),事件都會(huì)觸發(fā)執(zhí)行。
現(xiàn)在,我們需要設(shè)置S_Volume_Mix里的S_Music_Class聲音類的音量。這里要利用Set Sound Mix Class Override節(jié)點(diǎn),該節(jié)點(diǎn)允許我們指定一個(gè)混音和一個(gè)聲音類。如果混音里不存在指定聲音類,它會(huì)自動(dòng)將其添加進(jìn)去。如果已存在,則更新對(duì)應(yīng)的聲音類。
添加Set Sound Mix Class Override節(jié)點(diǎn),并做如下設(shè)置:
- In Sound Mix Modifier: S_Volume_Mix
- In Sound Class: S_Music_Class
- Fade in Time: 0(確保音量修改即時(shí)生效)
接著,如下連接節(jié)點(diǎn):
如法炮制設(shè)置EffectsSlider,將In Sound Class引腳修改為S_Effects_Class。
現(xiàn)在,只要滑條數(shù)值發(fā)生變動(dòng),S_Volume_Mix就會(huì)修改相關(guān)聲音類的音量。
最后我們還要激活對(duì)應(yīng)混音,才能讓這一切運(yùn)作起來(lái)。
激活混音
對(duì)本例而言(用UI控制音量),最好是在游戲一開(kāi)始激活混音。這樣聲音類一開(kāi)始就能用上混音設(shè)置。然而,簡(jiǎn)單起見(jiàn),本例中我們還是在控件中激活混音。
創(chuàng)建Event Pre Construct節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)跟藍(lán)圖的Event BeginPlay節(jié)點(diǎn)非常相似。
為了激活混音,我們要使用Push Sound Mix Modifier節(jié)點(diǎn),創(chuàng)建對(duì)應(yīng)節(jié)點(diǎn)并與Event Pre Construct相連,隨后設(shè)置In Sound Mix Modifier為S_Volume_Mix。
這樣在WBP_Options生成時(shí)就能激活S_Volume_Mix。
點(diǎn)擊Compile并關(guān)閉WBP_Options。按下Play運(yùn)行游戲,點(diǎn)擊M鍵彈出滑條,調(diào)整滑條感受音量的變化吧。
后續(xù)學(xué)習(xí)
你可以在這里下載完整項(xiàng)目。
如你所見(jiàn),在Unreal Engine 4里使用音頻非常簡(jiǎn)單。如果你想了解更多關(guān)于音頻系統(tǒng)的內(nèi)容,點(diǎn)擊查閱官方文檔。你還可以實(shí)現(xiàn)像混響或EQ這樣炫酷的效果,記得也關(guān)注下即將推出的全新音頻引擎。
如果你還想繼續(xù)學(xué)習(xí)引擎其他內(nèi)容,點(diǎn)擊下篇教程,將講解有關(guān)粒子特效的內(nèi)容。