激情六月丁香婷婷|亚洲色图AV二区|丝袜AV日韩AV|久草视频在线分类|伊人九九精品视频|国产精品一级电影|久草视频在线99|在线看的av网址|伊人99精品无码|午夜无码视频在线

高校合作1:010-59833514 ?咨詢(xún)電話:400-810-1418 服務(wù)與監(jiān)督電話:400-810-1418轉(zhuǎn)接2

在虛幻引擎中程序化地控制心跳速度

發(fā)布時(shí)間:2024-04-09 10:32:03 瀏覽量:209次

前言

最近和朋友組成了一個(gè)不大的工作室,正在開(kāi)發(fā)一款暫定名為《大荒鬼差》的游戲??梢哉f(shuō)的部分是,這是款注重探索、感知看不見(jiàn)的鬼,以及使用各種機(jī)關(guān)陷阱捉妖抓鬼的游戲。游戲中有很多關(guān)于對(duì)鬼感知的設(shè)計(jì),其中一個(gè)細(xì)節(jié)設(shè)定是:玩家在鬼附近時(shí),會(huì)有心跳聲強(qiáng)化氛圍、提供反饋——越是接近鬼,心跳越強(qiáng)烈。心跳既要營(yíng)造緊張感,同時(shí)還要給玩家提供足夠的信息,且聽(tīng)起來(lái)不違和、不死板。作為整個(gè)游戲第一塊與聲音相關(guān)的部分,我安排自己來(lái)做實(shí)現(xiàn)(非常有私心地想自己玩玩新的東西)。

先試最直觀的方案

首先,尋找一個(gè)心跳的音效。瀏覽過(guò)收藏的各種免費(fèi)商用的音效網(wǎng)站后,找到了一個(gè)非常干凈的心臟兩連跳音頻,它的波形也很像心跳。


導(dǎo)入 UE,直接修改播放速度,搞定了。輕松愉快......嗎?

并沒(méi)有。實(shí)際上,直接播放音頻是沒(méi)有播放速度這個(gè)選項(xiàng)的,對(duì)于音頻,直接的修改選項(xiàng)只有音量與音高。想要心跳加快,還需要引入其他的系統(tǒng)。

較為簡(jiǎn)單的替代方案

在多個(gè)版本的迭代中,UE 提供了多個(gè)聲音處理系統(tǒng),先用相對(duì)較老但也更簡(jiǎn)單易用的 Sound Cue 試一下。

官方文檔在這里:https://docs.unrealengine.com/5.2/zh-CN/sound-cues-in-unreal-engine/

與 UE 中絕大部分編輯器一樣,Sound Cue 也有一個(gè)節(jié)點(diǎn)化的編輯界面。整個(gè)系統(tǒng)支持的節(jié)點(diǎn)并不多,如下圖:


可以看到,沒(méi)有可以直接調(diào)節(jié)音頻播放速度的節(jié)點(diǎn)。為了讓心跳加速,我們要自己再想點(diǎn)辦法。

拆分、重組心跳

先拆解一下心跳聲音的構(gòu)成方式。心臟循環(huán)(躍動(dòng))一次會(huì)產(chǎn)生兩個(gè)聲音,分別是收縮和舒張,通常收縮的聲音更厚重,舒張的聲音則相對(duì)弱一些。其中時(shí)間間隔也有變化,同一次心臟跳動(dòng)的收縮與舒張的聲音間隔,比兩次心跳之間的時(shí)間間隔更短。這個(gè)時(shí)間比例基本在 1:2 左右。

根據(jù)我們的結(jié)論,先用 Logic Pro 將之前的音頻進(jìn)行拆解。


于是得到了兩個(gè)收縮音效與兩個(gè)舒張音效。

這樣拆開(kāi)之后,還額外帶來(lái)了一個(gè)好處:如果以一次收縮一次舒張作為一個(gè)完整的心跳循環(huán),拆開(kāi)之后的音頻一共可以產(chǎn)生四種不同的排列組合。每次心跳的時(shí)候隨機(jī)播放一種組合,可以盡可能減少玩家對(duì)重復(fù)聲音的厭倦,讓整個(gè)音效聽(tīng)起來(lái)不那么死板。

確定了方案,我們來(lái)看在 Sound Cue 中的具體實(shí)現(xiàn)方式。

  • 分別導(dǎo)出剛剛的 4 個(gè)音頻,導(dǎo)入 UE,拖入到 Sound Cue 的編輯界面;

  • 收縮音效一組,舒張一組,分別連接到 Random(隨機(jī))節(jié)點(diǎn),這樣每次播放的時(shí)候會(huì)隨機(jī)選取一個(gè)收縮音效和一個(gè)舒張音效;

  • 我第一次的想法是播完收縮音效后播放舒張音效,所以使用了 Concatenator(串聯(lián)器)節(jié)點(diǎn)。但是根據(jù)前面的分析,收縮與舒張之間的時(shí)間、舒張與下一次收縮之間的時(shí)間都需要調(diào)節(jié),按當(dāng)前設(shè)計(jì),收縮與舒張的間隔只能增加不能減少,所以 Concatenator 不能滿足需求;

  • 能夠滿足需求的方式是使用一個(gè) Mixer(混音器),加一個(gè) Delay(延遲)節(jié)點(diǎn),讓舒張音效通過(guò) Delay 節(jié)點(diǎn)延后一小段時(shí)間播放,再將兩個(gè)有所錯(cuò)位的音頻連入同一個(gè) Mixer;

  • 現(xiàn)在已經(jīng)構(gòu)成了一次完整的心跳,Sound Cue 支持在節(jié)點(diǎn)上直接試聽(tīng)當(dāng)前節(jié)點(diǎn)的結(jié)果,此時(shí)在 Mixer 節(jié)點(diǎn)上試聽(tīng),多次播放就可以聽(tīng)到多種不同的心跳效果;

  • 因?yàn)槲覀兊男奶且粋€(gè)連續(xù)音效而不是單次效果,所以在獲得了單個(gè)心跳音效后,我們還需要再增加一個(gè) Delay 來(lái)表示兩次心跳之間的間隔,接著再連接一個(gè) Loop(循環(huán))節(jié)點(diǎn),最終連上輸出節(jié)點(diǎn)。此時(shí)播放整個(gè) Sound Cue 效果,就可以聽(tīng)到無(wú)限延續(xù)的心跳聲;

  • 要加快心跳,只需要修改兩個(gè) Delay 節(jié)點(diǎn)的時(shí)長(zhǎng)。因?yàn)闀r(shí)間計(jì)算是從收縮的起始時(shí)間開(kāi)始的,所以注意,需要保持一個(gè) 1:3 的比例。

回到最開(kāi)始的需求?,F(xiàn)在的心跳音效已經(jīng)比較生動(dòng)了,也有了可以控制速度的方式,接下來(lái)就需要將這個(gè)音效交給游戲程序,根據(jù)情況計(jì)算并設(shè)置心跳速度即可。

然而事情沒(méi)有這么簡(jiǎn)單,Sound Cue 中的數(shù)值調(diào)節(jié)只能手動(dòng)設(shè)定,UE 官方并沒(méi)有提供通過(guò)運(yùn)行時(shí)的程序控制這些變量的方法。

PS:Delay 中倒是可以設(shè)定隨機(jī)的延遲時(shí)間,但那也只會(huì)得到一個(gè)心律不齊的心跳音效。

PPS:在這款游戲里,一個(gè)心律不齊的心跳音效或許也有用武之地。

為了程序化地控制心跳速度,我們將會(huì)掏出今天的最終武器,MetaSounds 系統(tǒng)。

來(lái)吧,元(Meta)起來(lái)

Unreal Engine 5 introduces MetaSounds, a high-performance audio system that provides audio designers with complete control over a Digital Signal Processing (DSP) graph for the generation of sound sources.

根據(jù)官方介紹,MetaSounds 是一個(gè)[次世代][圖形化][高性能][音頻數(shù)字信號(hào)]處理系統(tǒng)。理論上,音頻設(shè)計(jì)師可以設(shè)計(jì)出在游戲運(yùn)行時(shí)動(dòng)態(tài)處理音頻甚至生成音頻的節(jié)點(diǎn)圖。

官方文檔在這里https://docs.unrealengine.com/5.2/zh-CN/sound-cues-in-unreal-engine/

這套系統(tǒng)完全可以從簡(jiǎn)單的波開(kāi)始,通過(guò)各種調(diào)制制造音效。但今天,我們只應(yīng)用其動(dòng)態(tài)傳入控制參數(shù)的功能,補(bǔ)全在 Sound Cue 那個(gè)方案中缺失的部分。


整體邏輯與在 Sound Cue 中一樣,兩組聲音,各自隨機(jī)選擇一個(gè),給舒張音效加上 Delay,再用 Mixer 一起輸出,循環(huán)起來(lái)就是心跳音效。接下來(lái)重點(diǎn)說(shuō)一下不同的部分:

  • 首先是音頻的導(dǎo)入方式,MetaSounds 采用的是參數(shù)化的輸入,所以音頻素材是類(lèi)型為` Wave Asset` 的輸入?yún)?shù),由于我們要在多個(gè)音頻中隨機(jī),所以最終是參數(shù)類(lèi)型為 Wave Asset 的數(shù)組(我們需要收縮與舒張各一個(gè)數(shù)組);


  • 其次需要定義一下調(diào)節(jié)心跳速率的變量。根據(jù)之前的設(shè)計(jì),心跳速度使用兩個(gè) Delay 的時(shí)間來(lái)定義,類(lèi)型是時(shí)間,又因?yàn)槲覀兊膬蓚€(gè)時(shí)間間隔是有數(shù)學(xué)關(guān)系的,所以只需要定義一個(gè)參數(shù),計(jì)算另外一個(gè)就可以了(這里又用到了 MetaSounds 的一個(gè)重要功能,就是數(shù)學(xué)計(jì)算);


  • 再次是循環(huán)的方式。Sound Cue 是在最后添加一個(gè)循環(huán)節(jié)點(diǎn),而 MetaSounds 是在整個(gè)播放邏輯之前加入 Repeat Trigger(重復(fù)觸發(fā)器)。


到這里,所需音效就基本完工了,但我們還要再補(bǔ)充兩個(gè)細(xì)節(jié)。

  • MetaSounds 構(gòu)造的音頻資產(chǎn)默認(rèn)是有一個(gè) OneShot(一次性)接口的,我們實(shí)現(xiàn)的心跳音效是持續(xù)不斷的,所以要將這個(gè)接口刪掉;

  • 通常來(lái)講,隨著心跳加速,心跳的音量也會(huì)增強(qiáng),所以我們?cè)偌尤胍粋€(gè)浮點(diǎn)型的變量作為控制音量的參數(shù),連接到最終 Mixer 的增益上,整個(gè)音效就更加生動(dòng)了。

小結(jié)與展望

得到 MetaSounds 的資產(chǎn),我們就可以在游戲角色的運(yùn)行時(shí)邏輯中調(diào)用播放,并根據(jù)距離設(shè)定心跳間隔和音量了。這部分比較簡(jiǎn)單,但由于我們游戲中的心跳計(jì)算并不只與距離有關(guān)(稍有點(diǎn)復(fù)雜),所以采用 C++ 來(lái)實(shí)現(xiàn)。這里就不貼出來(lái)了,直接控制心跳的話可以參考這個(gè)圖。


以上就是今天的全部?jī)?nèi)容。

本篇日志記錄的,都是基于 UE 官方教程匹配己方需求的應(yīng)用,可能不是最佳的實(shí)踐,也還有很多改進(jìn)空間,但我覺(jué)得思路很有趣,使用的工具也是之前完全沒(méi)有接觸過(guò)的,所以值得記錄和分享一下。如果真的有人能看到這里,希望你能有所收獲,同時(shí)祝愿我們的游戲可以順利完工。

隨緣更新,各位有緣再見(jiàn)。


* 本文為用戶投稿,不代表 indienova 觀點(diǎn)。



熱門(mén)課程推薦

熱門(mén)資訊

請(qǐng)綁定手機(jī)號(hào)

x

同學(xué)您好!

您已成功報(bào)名0元試學(xué)活動(dòng),老師會(huì)在第一時(shí)間與您取得聯(lián)系,請(qǐng)保持電話暢通!
確定