Unity Audio -- (2)創(chuàng)建動(dòng)態(tài)音效
評(píng)估場(chǎng)景需求
????????本節(jié)的目標(biāo)是添加腳步聲到角色身上,當(dāng)角色走路時(shí),觸發(fā)動(dòng)畫事件并播放聲音。
? ? ? ? 腳步聲是我們?cè)谡鎸?shí)世界中常常被我們所忽視的聲音,但腳步聲能夠傳達(dá)出許多環(huán)境信息。你現(xiàn)在可以花一小段時(shí)間繞著你周圍的環(huán)境走一走并仔細(xì)聽聽腳步聲。如果可能的話,在不同的表面上都行走一下,然后感受一下腳步聲在不同的表面上的聲音有什么不同(比如地毯和木地板上)?光腳和穿鞋時(shí)聲音有什么不同?
? ? ? ? 在示例場(chǎng)景中,我們可以看到三種不同的地面:草地、池子的水和洞穴。當(dāng)玩家走過這些表面時(shí),應(yīng)該有不同的腳步聲。

添加動(dòng)畫事件(Animation Events)
? ? ? ? 我們希望達(dá)到的效果是,當(dāng)角色的腳正好碰到地面時(shí),會(huì)播放對(duì)應(yīng)的腳步聲。在Unity中,我們可以通過使用動(dòng)畫事件來完成這個(gè)功能,將角色動(dòng)畫動(dòng)作過程的某個(gè)部分關(guān)聯(lián)出對(duì)應(yīng)音效的播放。動(dòng)畫事件的工作原理和關(guān)鍵幀是類似的,但它不是用來告訴角色該如何運(yùn)動(dòng),而是發(fā)送一個(gè)消息,這個(gè)消息能夠被腳本用來做一些事情。在案例中,我們會(huì)使用一個(gè)預(yù)先寫好的腳本來播放腳步聲。
? ? ? ? 1. 進(jìn)入到放置動(dòng)畫的目錄,Assets > CreativeCore_Audio > StarterAssets > ThirdPersonController > Character > TutorialAnimations。
? ? ? ? 2. 選擇Locomotion--Walk_N動(dòng)畫
? ? ? ? 3. 在Inspector中,選擇Animation標(biāo)簽頁(yè),展開Events部分。

? ? ? ? 4. 我們可以按住并向上拖動(dòng)動(dòng)畫預(yù)覽窗口上的帶兩條線的地方,將預(yù)覽窗口放大一些。

? ? ? ? 5. 拖動(dòng)到角色左腳剛好接觸地面的這一幀(大概是第9幀的位置)。
? ? ? ? 6. Inspector中回到Events部分,點(diǎn)擊Add Event按鈕。

? ? ? ? 7. 在funtion參數(shù)中,輸入“PlayStep”。這個(gè)名字是后面我們要使用的腳本里的一個(gè)方法是對(duì)應(yīng)的,因此確保這個(gè)名字拼寫是沒有問題的。

? ? ? ? 9. 在Inspector的底部,點(diǎn)擊Apply按鈕,保存事件到動(dòng)畫中。
? ? ? ? 10. 在Animations目錄中找到Run和Jump Landing的動(dòng)畫,重復(fù)上面添加event的過程。記住最后要點(diǎn)擊Apply按鈕保存修改。
應(yīng)用Audio腳本
? ? ? ? 目前動(dòng)畫已經(jīng)配置成了當(dāng)角色腳接觸地面的時(shí)候,會(huì)發(fā)送出一個(gè)事件請(qǐng)求。這個(gè)事件會(huì)傳遞給和動(dòng)畫相連接的游戲?qū)ο?,因此管理腳步聲播放的腳本必須被用到角色上。為了能實(shí)際為動(dòng)畫播放聲音,我們還需要給角色增加一個(gè)Audio Source組件。
? ? ? ? 1. 在Scritps目錄下,找到FootstepManager腳本。將這個(gè)腳本添加到Hierarchy里的ThirdPersonController里的PlayerArmature游戲物體上。
? ? ? ? 2. 保持player被選中,在其Inspector中點(diǎn)擊Add Component按鈕,然后搜索并選擇Audio Source。

探索聲音腳本
? ? ? ? 我們簡(jiǎn)單看看FootstepManager腳本。在Inspector中,我們可以看到它下面有三個(gè)下拉菜單,標(biāo)記為grass,water和cave,分別對(duì)應(yīng)三種不同的腳步聲。這些下拉菜單表示的是多個(gè)腳步聲的list。在后面我們會(huì)討論原因。

? ? ? ? OnControllerColliderHit方法會(huì)檢測(cè)player當(dāng)前行走在什么類型的表面上,它是通過檢查關(guān)聯(lián)的tag來實(shí)現(xiàn)這個(gè)功能的(這些tag我們會(huì)在后面添加)。
? ? ? ? 當(dāng)場(chǎng)景中發(fā)生了我們之前配置的動(dòng)畫事件,它會(huì)調(diào)用PlayStep方法,這個(gè)方法會(huì)隨機(jī)從前面我們看到的不同類型的表面的腳步聲list中選擇其中一種出來進(jìn)行播放。
給場(chǎng)景的不同表面打tag
? ? ? ? 為了要讓腳本知道該播放哪類聲音,F(xiàn)ootstepManager首先需要知道player當(dāng)前站在哪種類型的表面上。我們可以通過使用tag來實(shí)現(xiàn)這個(gè)功能。
? ? ? ? 1. 在場(chǎng)景視圖中選擇grass表面。在Inspector的頂部,選擇Tag處的下拉菜單,然后在列表底部選擇Add Tag。

? ? ? ? 3. 再創(chuàng)建兩個(gè)新的tag:Water和Cave。
? ? ? ? 4. 在場(chǎng)景中再次選擇grass表面,將tag設(shè)置為Grass。

? ? ? ? 6. 選擇場(chǎng)景視圖中的cave,將tag設(shè)置為Cave。
添加腳步音頻片段
? ? ? ? 目前場(chǎng)景已經(jīng)為腳步聲腳本播放合適的聲音做好了配置,接下來我們要將對(duì)應(yīng)的音頻片段添加進(jìn)來了。之前我們說過,腳本的每種類型的Audio clip片段變量是一個(gè)列表,這個(gè)列表可以包含多個(gè)音頻片段。腳本里會(huì)隨機(jī)選擇其中一個(gè)進(jìn)行播放。這里為什么要用多個(gè)音頻片段呢?如果我們只為每種類型的腳步聲添加一個(gè)音頻片段會(huì)怎樣呢?
? ? ? ? 1. 在Audio文件夾中,選擇一種grass腳步聲片段,將它拖動(dòng)到FootstepManager腳本組件(和PlayerArmature關(guān)聯(lián))里的Grass Steps變量上。在列表中會(huì)自動(dòng)出現(xiàn)這個(gè)音頻片段。
? ? ? ? 2. 重復(fù)上面的步驟,添加water和cave的腳步聲片段。
? ? ? ? 3. 運(yùn)行場(chǎng)景,四處走動(dòng)一下,控制角色分別在三種不同的表面上行走。
? ? ? ? 剛開始我們可能還沒什么感覺,但如果我們?cè)趫?chǎng)景上控制角色多走一會(huì)兒,我們會(huì)很快開始覺得腳步聲沒有什么變化。也許在切換到不同表面的時(shí)候,我們還能有點(diǎn)明顯的感受,但最終我們都會(huì)注意到其實(shí)每種聲音都是固定的一種,沒有變化,會(huì)讓人感到無聊。
? ? ? ? 由于角色在實(shí)際的游戲中在各個(gè)場(chǎng)景里基本是保持不變的,可以確定的一件事是玩家最終肯定會(huì)察覺到這些單調(diào)的腳步聲。腳步聲只有一種,也不符合我們?cè)谡鎸?shí)世界中的體驗(yàn)。真實(shí)世界中,我們的每一步即便踩在相同的地面上,由于動(dòng)作上的細(xì)微差異,可能重一點(diǎn)或輕一點(diǎn),也可能是會(huì)多摩擦了一會(huì)兒地面,會(huì)導(dǎo)致聲音有變化。雖然我們不可能在游戲中為一種腳步聲添加成百上千種音頻片段,但多幾個(gè)片段隨機(jī)選擇總會(huì)比單一重復(fù)的一種片段要好得多。
? ? ? ? 4. 在Audio目錄中選擇所有的grass腳步聲片段,拖動(dòng)它們到Inspector中FootstepManager腳本組件(和PlayerArmature關(guān)聯(lián))里的Grass Steps列表上。
? ? ? ? 5. 重復(fù)上面的步驟添加water和cave對(duì)應(yīng)的所有腳步聲片段。
? ? ? ? 6. 運(yùn)行場(chǎng)景,控制角色在不同的平面上行走,聽聽看效果有什么不同。
探索:進(jìn)一步定制腳步聲
? ? ? ? 在前面我們用了一些不同的腳步聲音頻片段來實(shí)現(xiàn)草地、水面和洞穴情況時(shí)的音效。實(shí)際在在Unity中替換這些音頻片段非常簡(jiǎn)單。接下來我們可以去試試加入不同的音頻片段,可以天馬行空一下,比如角色踩到草地上時(shí),我們播放羊叫的聲音。
? ? ? ? 除了Unity的資源商店,網(wǎng)絡(luò)上還有很多地方提供了很不錯(cuò)的音效文件。比如:
? ? ? ??
????????不管我們?cè)趺茨玫揭纛l文件的,有一點(diǎn)需要我們注意的是我們所使用的音頻的license。license類型會(huì)告訴我們對(duì)應(yīng)音頻文件的使用者所需要注意的地方,比如下面這個(gè)Open Game Art的例子(Public Domain):

????????在Unity中,可以使用的音頻文件格式有:aif, .wav, .mp3 以及.ogg。