在《BPM: Bullets Per Minute》中將音樂和玩法同步

決定要制作怎樣的節(jié)奏 FPS
《BPM: Bullets Per Minute》是一款節(jié)奏動作 FPS 游戲,當中的射擊、換彈、跳躍和躲閃動作全都與節(jié)拍同步。

在準備開始制作的時候,我們考慮了以下聲音設計方式:
1.?音符表(如《Guitar Hero》、《Rock Band》、《Frets on Fire》)。每條音軌都有用來定義攻擊、躲閃和換彈節(jié)奏的元數(shù)據。這些元數(shù)據可告知敵人行為。音符表會告訴 AI 要做什么。
優(yōu)點:心潮澎湃的音樂編排體驗、可以由用戶生成優(yōu)質內容。
缺點:每分鐘游戲的制作成本很高。耐玩性低。
2.?程序化音樂(如《PaRappa the Rapper》或《Wii Music》)。音樂由音軌段落組成。音軌段落是動態(tài)變換的,由算法選擇下一個要播放的音軌段落。AI 會在各個音軌段落的特定標記點發(fā)起攻擊。
設想一下當敵人在十六分音符處快速攻擊時播放鼓聲段落,隨后當敵人在小鼓聲處發(fā)起攻擊時播放反拍。
優(yōu)點:動感、耐玩。
缺點:音樂品質較低。音樂由玩家定義,而不是歌曲結構,音樂體驗比較差。
3.?緊跟節(jié)拍(如《Crypt of the NecroDancer》)。AI 始終與歌曲的節(jié)拍保持一致,但動作并不依賴于音軌的狀態(tài)。
優(yōu)點:動感、耐玩。音樂可以有自己的多彩變換,便于輕松制作更多音樂內容,游戲設計不依賴于現(xiàn)成音樂。
缺點:音樂不是為體驗量身打造的。
作為一個小型團隊,我們想做一款規(guī)模相對較大、能玩好幾個小時的游戲。為此,我們決定選用“緊跟節(jié)拍”這一聲音設計方式。與此同時,我們想在開發(fā)游戲時樂在其中,所以選擇了 Roguelike 結構。Roguelike 游戲的隨機關卡生成意味著每次試玩都會有不一樣的體驗。鑒于 Roguelike 游戲需要很高的耐玩性,我們知道“音符表”方式無法滿足《BPM》高達 30 小時的游戲時長要求。
為此,我們決定在《BPM》中加入一些程序化音樂,大多在快要戰(zhàn)勝 BOSS 時以插播樂句的形式呈現(xiàn)。在打敗 BOSS 之后,其會隨著玩家操作逐漸增強。
協(xié)調玩法
《BPM》的玩法機制本質上是個每分鐘 88 拍的 4/4 拍步進音序器。敵人可以請求在幾拍的時間內發(fā)動攻擊。他們通過查詢步進音序器確認在某一拍發(fā)起攻擊是否會導致環(huán)境過于嘈雜。

敵人告知步進音序器“我想在兩個節(jié)拍內攻擊玩家,迫使他們躲閃”。步進音序器回應“是”或“否”。步進音序器的響應基于這一拍上是否發(fā)起了太多攻擊或者有沒有別的敵人完全占用這一拍。通過這種方式,《BPM》的整個玩法機制都可以由步進音序器來控制。
玩家的玩法機制中也引入了這種音序器。事實上,玩家只能在每個半拍執(zhí)行操作。比如,玩家可以每隔半拍射擊、跳躍或施法。不過,每次只能做一個動作:換彈、躲閃、射擊或施法(跳躍動作不受限制;試過跟節(jié)拍同步,但效果很不理想)。
從技術角度來說,主要難點在于確保知道音軌中的“節(jié)拍”何時發(fā)生。為此,我們在 Unreal Engine 內做了各種嘗試,但是都沒有辦法讓音頻時鐘和游戲時鐘同步。除此之外,我們還希望在音軌之間過渡,確保不會因為采樣缺失而產生噼啪噪聲。
為此,我們選擇了使用 Wwise 來解決了以下三個問題:
1. 保證音軌之間的流暢過渡。
2. 確保音樂合拍、音效可聞。
3. 讓游戲的時鐘與節(jié)拍同步。
過渡和效果
喬什?沙利文 (Josh Sullivan):我負責《BPM》的所有聲音設計。我的聲音制作/混制過程比較特別。我在視頻制作方面有十多年的經驗,所以在使用程序來處理要應用到《BPM》中的聲音時,我選用了 Sony Vegas(視頻剪輯軟件)而非專門的音頻剪輯套件。除了有個視頻預覽窗口,Vegas 其實跟 Sound Forge(Sony 的音頻剪輯套件)差不了多少。
幸運的是,《BPM》的配樂為每分鐘 88 拍。由于整個游戲中始終采用這一曲速,我可以輕松地將所有要合拍的音頻序列剪輯成 88 bpm 的節(jié)拍音軌。比如,《BPM》中武器的換彈都是緊跟節(jié)拍的(給人一種類似《Baby Driver》的感覺)。為此,我將一條節(jié)拍音軌放到了 Vegas 時間線中,通過剪輯確保各個聲音跟此節(jié)拍音軌步調一致。每個聲音都會被調到這一曲速。不過,如果設置不同的曲速,這種方法便無法奏效。

在聲音做好之后,只需把它們導入到 Wwise 中并在必要時為其提供定位數(shù)據便可。在必要的情況下,我可以對聲音實例數(shù)加以限制。比如,急射小機槍就需要這樣做,其每個四分音符都會射擊。由于射擊速度很快,混音有時會很嘈雜。為此,最好限制為同一時間最多只有一個急射小機槍射擊聲。隨后,我調節(jié)了一下 General Settings(聲部、音高等)。最后,我將聲音設置到了與之對應的 Output Bus 上。對于像射擊這樣的操作,每種槍支都設有至少四個不同的聲音。然后,我把它們全部放在了 Random Container 中。這樣就可避免因為反復播放同一槍聲而讓玩家感到單調乏味。

之后,只需在 Wwise 中為對應的音頻創(chuàng)建 Event 即可。不過,我并沒有把 Event 搞得太復雜。其中一個用法是先停掉之前的聲音再播放后面的聲音。比如,在敵人發(fā)出呱噪聲時(跟著節(jié)拍咕噥、吼叫)。在觸發(fā)代表敵人痛苦的 Wwise Event 時,不僅會播放 "ouch" Random Container,還會把敵人的呱噪聲切掉。
在 Wwise 中,我可以使用 Music Switch Container 和 Music Playlist Container 輕松實現(xiàn)樂曲之間的過渡,并借助時間設置來確保所有音樂都與節(jié)拍同步。
在游戲中,有些音樂不應與節(jié)拍同步,好比在跟 BOSS 決戰(zhàn)的時候。在跟 BOSS 戰(zhàn)斗時,不用時刻踩著節(jié)奏做動作;只要在音符上就可以射擊,但每個音符都要無限循環(huán),直到下一次扣動扳機射擊。它們在技術上來說是音樂,但我在 Wwise 中將其當成了聲音來處理,因為以 Wwise Event 的形式實現(xiàn)更容易。
為節(jié)奏動作游戲混音
山姆?霍頓 (Sam Houghton):在為《BPM》混音時,我的主要目標是讓玩家感覺好像自己在指揮一個搖滾樂團。武器是混音中的主要樂器,為的是當玩家沉浸在游戲中節(jié)節(jié)獲勝時為其提供巨大的成就感。相反,倘若沒能把握好射擊或換彈的節(jié)奏,便不會有聲音響起,聽起來讓人感到挫敗和沮喪。
與此同時,我還在跟喬?柯林森 (Joe Collinson) 一起創(chuàng)作音樂,所以為這些聲音的編排留了一些空間。網上有很多人都說 OST 聽起來很棒,在游戲中混入槍聲后效果甚至更好。能得到玩家的認可,讓我感到非常欣慰。畢竟,游戲配樂正是為了支撐玩法機制。只是跟很多其他類型的游戲相比,《BPM》在這一點上做得更鮮明。
早前,我確實嘗試了在玩家做“合拍互動”時閃避音樂聲道。然而,這種細微效果并不能增強成就感,甚至還有可能會讓游戲失去生氣。因此,我只在 Wwise 中稍微做了一些電平調節(jié),來確保在音樂方面一切都很鮮明而有力。喬什?沙利文把所有聲音都做得很好,所以可以非常輕松地對游戲進行混音。?
讓游戲的時鐘與節(jié)拍同步
大衛(wèi)?瓊斯 (David Jones):說到讓游戲的時鐘與節(jié)拍同步,我覺得最好的做法是《Borderlands》的解決方案,即修改 Wwise 來強制 MIDI 調用中斷游戲邏輯。在每一拍的結尾,我們可以請求獲取其時的輸入狀態(tài)。
最好是每次在 Wwise 中調用節(jié)拍 Event 時馬上輪詢控制器輸入。這種方式類似于傳統(tǒng)采樣器。在實現(xiàn)中將輸入和音頻緊密綁定在一起,判斷玩家的輸入是早是晚以及相差多久,確保輸入和音頻之間的同步盡可能精準。然后,拒絕那些跟音樂過于不合拍的輸入。不過,這一解決方案對我們這樣規(guī)模的團隊來說并不可行。這種工作要有全職音頻程序員協(xié)助,因為它會干擾 Unreal Engine 的整個輸入系統(tǒng),并且需要對 Wwise 進行修改。最終,我們決定采取不同的做法。
簡便之法
我們的解決方案非常簡單和便捷。具體來說就是針對音樂 Event 注冊回調,并查找?EAkCallbackType::MusicSyncBeat。每次有來自 Music Switch Container 的音樂 Event,我們就會發(fā)現(xiàn)游戲時鐘和音軌行進之間的偏差。如果該偏差大于 10 ms,則重新校準游戲時鐘,并為所有相關角色調用 Event。
我們選用這種簡單的校準方法是因為游戲玩法不需要很花哨。這樣可確保敵人行為大致合拍。最多只有 10 ms 的偏差,比節(jié)奏測試窗口小得多。
不過對于玩家的輸入,還有其他錯誤要考慮。玩家錯誤窗口為:
源自時鐘校準的 10 ms + 源自幀時間的 [frametime] ms + 源自延遲渲染器的 [frametime] ms + 源自輸入設備的 ? ms + 源自主機處理的 ? ms + 源自TV/音頻輸出處理的 ? ms。
這在有些系統(tǒng)上最終可能會產生巨大的偏差。這一偏差對每個用戶來說都是非常不一樣的。不過,還有更糟糕的問題:節(jié)奏 FPS 有個無解的難題 (Cursed Problem)。
在 2019 年的 GDC 演講中,來自 Riot Games 的亞歷克斯?杰斐 (Alex Jaffe) 將“無解的難題”定義為“根植于核心玩家承諾之間的沖突而無法解決的設計問題”。在《BPM》中,我們的玩家承諾是“玩家跟著節(jié)拍同步射擊”和“子彈在扣動扳機時射出”。然而,兩者是沖突的。要想解決這一問題,只能“以退為進”。
在像《Guitar Hero》這樣的對拍游戲中,會依據通過校準控制器設定的延遲來對玩家輸入施加偏置。因為音符沒有任何因果效應,所以可以在測試時計入延遲。游戲會通過測試玩家之前是否做到了跟著節(jié)拍輸入來對視頻延遲加以補償。游戲知道應當在何時壓在音符上、實際在何時壓在了音符上以及 TV 延遲有多長時間。所以,游戲會檢查并確認是否在“當前時間 - 延遲時間”的窗口內。這可能不太好理解。在《Guitar Hero》中,可以看到音符在線以下會消失,過了線好像也能成功彈到音符。TV 有延遲,而且可以實時看到這一延遲。然而,這在 FPS 中是不可行的。所有動作都要壓在點上。
在《BPM》中,我們假定用戶的延遲小于 80 ms。倘若用戶的延遲超過這個時間,在開機校準序列當中會檢測到,并依據情況啟用自動節(jié)奏功能。自動節(jié)奏功能會在玩家輸入時一直將射擊動作保持到下一拍。對于延遲小于 80 ms 的用戶,如果射擊的時機早了,我們會應用一定延遲,確保其發(fā)生在下一拍;倘若射擊的時機晚了,會讓該動作立即發(fā)生。
為了給玩家提供更好的游戲體驗,《BPM》會容許某些不合拍的操作。有很多邏輯來定義什么是容許的、什么是不容許的。主要是為了使所有的輸入配置都能順利地發(fā)揮作用。我們希望能為玩家提供酣暢的射擊體驗,而不是制作一款嚴格意義上的節(jié)奏游戲。
最終,《BPM》因為將音樂和玩法緊密融合在一起而大獲成功。在這當中,Wwise 幫助我們高效而精準地實現(xiàn)了自己的設想。?


AWE INTERACTIVE
Awe Interactive 是一家業(yè)務遍及全球的遠程電子游戲開發(fā)商(總部位于英國貝德福德郡),致力于為玩家打造獨具特色的游戲體驗。Awe 在 2020 年推出了節(jié)奏 FPS 游戲《BPM: Bullets Per Minute》。《BPM》因其音頻、聲音設計和原創(chuàng)機制而廣受贊譽。公司目前正在制作一款科幻 RPG 游戲。
