王昊翔,丁海洋
(西京學(xué)院信息工程學(xué)院,陜西西安,710123)
近年來,國內(nèi)的主機(jī)游戲市場不斷的發(fā)展壯大。隨著技術(shù)的不斷成熟,越來越多的廠商和工作室也開始投入到單機(jī)游戲的研發(fā)中。許多優(yōu)秀的單機(jī)游戲產(chǎn)品,如雨后春筍萌芽。像《黑神話悟空》、《失落之魂》、《暗影火炬城》這些動作游戲都是由虛幻引擎開發(fā),并以爽快的即時戰(zhàn)斗作為賣點(diǎn)。國內(nèi)著名的三劍IP,《仙劍奇?zhèn)b傳》、《軒轅劍》和《古劍奇譚》的最新作品也由傳統(tǒng)的回合制戰(zhàn)斗轉(zhuǎn)向了即時戰(zhàn)斗的動作類游戲,其中前兩者的最新作品皆由虛幻引擎開發(fā)。
本文使用虛幻引擎對時下流行的即時戰(zhàn)斗的動作類游戲產(chǎn)品的重要系統(tǒng)之一的受擊反饋系統(tǒng)進(jìn)行了研究,結(jié)合虛幻各個模塊功能,設(shè)計(jì)了一套受擊反饋系統(tǒng),通過該系統(tǒng)的設(shè)計(jì)來探索動作類游戲的核心體驗(yàn)。
虛幻引擎是由著名游戲公司EPIC開發(fā)的開源的通用引擎,面向企業(yè)、工作室、個人等不同程度的開發(fā)者提供游戲開發(fā)所需要的核心技術(shù)、數(shù)據(jù)生成工具和技術(shù)支持。
作為全球最開放、最先進(jìn)的商用引擎,基于C++開發(fā)的虛幻引擎在底層擁有很強(qiáng)的拓展性,同時對于上層開發(fā),虛幻引擎也提供了藍(lán)圖這樣的解決方案,減輕了非從業(yè)者和業(yè)余開發(fā)人員的上手門檻。擁有完整的開發(fā)流程和渲染管線的虛幻引擎是一套非常優(yōu)秀的開發(fā)工具,不僅可以應(yīng)用于獨(dú)立作品,也同適用于各類3A級大作的開發(fā)。能夠提供多種解決方案的虛幻引擎被用于游戲行業(yè),同時在建筑、汽車、影視、實(shí)況活動、以及訓(xùn)練與模擬等行業(yè),虛幻引擎也同樣大放光彩。在它20多年的歷史里,虛幻引擎久經(jīng)考驗(yàn),贏得無數(shù)開發(fā)者的認(rèn)可,產(chǎn)出無數(shù)優(yōu)秀的作品。
目前主流的動作游戲中,打擊感的體現(xiàn)主要來源于打擊動作發(fā)生時產(chǎn)生的一系列反饋,這種反饋包括打擊時產(chǎn)生的打擊特效、音效、擊中瞬間卡幀、揮舞動作之間幀速率的加減速、UI特效、屏幕震動、手柄震動、受擊角色對應(yīng)的受擊動畫和受擊部位的膨脹和抖動、鏡頭角度變化等效果。因此打擊感是綜合了視覺效果、聽覺效果、觸覺效果等多方面得來的,如圖1所示。根據(jù)具體游戲的不同,或者是一款游戲不同類型的受擊目標(biāo),這些反饋效果的細(xì)節(jié)的處理也是大有不同。
圖1 受擊反饋的體現(xiàn)
虛幻引擎在開發(fā)游戲的時候通常有兩種動畫方案,一種是原地動畫、另一種是根骨骼動畫。原地動畫不包含根位移,在虛幻引擎中可以通過播放原地動畫的同時,可以通過移動角色的膠囊體來使角色產(chǎn)生相應(yīng)的位移效果,這種方式可以讓一種動畫適應(yīng)多種場景,但是通過代碼調(diào)試出來的效果往往也會缺失真實(shí)感和流暢感。在動作游戲的制作,想要達(dá)到比較真實(shí)的效果的時候,通常可以將位移信息存儲在動畫中做出根骨骼動畫,這種動畫雖然少了一些使用的靈活性,在適應(yīng)多種情況的時候也增大動畫的工作量,但是確能換來較為真實(shí)的動畫表現(xiàn)。因此本文所設(shè)計(jì)的受擊反饋系統(tǒng),在受擊動畫的表現(xiàn)上均采用根骨骼動畫來混入、混出,表現(xiàn)一種較為真實(shí)的受擊效果。
受擊狀態(tài)的發(fā)生通常在攻擊檢測完成后,或者受擊角色與場景內(nèi)的物體產(chǎn)生了互動,例如有巨石滾下與受擊角色發(fā)生了碰撞。在虛幻引擎中,后者可以通過在角色和物體產(chǎn)生碰撞時,借助引擎自身的物理引擎效果,開啟角色物理模擬來實(shí)現(xiàn)布娃娃效果。本文的受擊反饋系統(tǒng)同樣也借助引擎自身的物理模擬效果著重考慮在攻擊檢測完成后,受擊角色通過受擊的方向、受擊的部位以及受擊時的沖量使受擊的部位產(chǎn)生一定程度的抖動,通過這種抖動來反應(yīng)一種比較真實(shí)的部位受擊效果。
所有具有受擊反饋需求的角色模型在導(dǎo)入引擎中時需要具備較為完整的骨骼信息,根據(jù)角色骨骼信息建立物理資產(chǎn)。在虛幻引擎中,可以通過其自帶的物理模擬系統(tǒng),使角色產(chǎn)生比較真實(shí)的物理反饋,其中角色的物理模擬效果,很大程度上取決于物理資產(chǎn)的設(shè)定。在物理資產(chǎn)建立的時候,我們不需要為每一個骨骼建立相應(yīng)的物理資產(chǎn),重點(diǎn)為那些帶有驅(qū)動其它部位運(yùn)動的部位添加物理資產(chǎn),并通過實(shí)際模擬出來的效果調(diào)整各個關(guān)聯(lián)部位之間的物理資產(chǎn)的偏移限制如圖2所示。
圖2 角色物理資產(chǎn)設(shè)置
在受擊情況發(fā)生后,角色會從現(xiàn)有的動畫狀態(tài)跳轉(zhuǎn)到受擊動畫中去,為了實(shí)現(xiàn)動畫效果比較流暢的過度,本文采用虛幻引擎自帶的動畫蒙太奇功能來進(jìn)行受擊動畫的混入和混出。通過將準(zhǔn)備好的帶有受擊位移信息的受擊根骨骼動畫以片段的形式被動畫蒙太奇調(diào)用,在接收到受擊信息的時候,根據(jù)相應(yīng)的受擊方向信息來觸發(fā)運(yùn)用動畫蒙太奇方式播放相應(yīng)的受擊動畫片段。例如,當(dāng)角色受到來自自身右側(cè)方向的攻擊時,蒙太奇會調(diào)用標(biāo)記有右側(cè)受擊的根骨骼動畫片段進(jìn)行混入播放,如圖3所示。
圖3 蒙太奇動畫設(shè)置
當(dāng)攻擊角色做出攻擊動作后,根據(jù)獲取預(yù)先設(shè)置在攻擊角色武器上的插槽位置,可以打出符合武器揮動軌跡的射線檢測,射線檢測在與有效的受擊角色發(fā)生重疊后會通過一系列的邏輯向受擊角色發(fā)送武器的攻擊方向,擊中點(diǎn)的部位、所產(chǎn)生的攻擊類型和依據(jù)攻擊類型所產(chǎn)生的沖量數(shù)據(jù),并在受擊點(diǎn)位播放對應(yīng)的打擊特效和聲效,應(yīng)用UI特效和屏幕震動。受擊角色會根據(jù)傳遞過來的數(shù)據(jù)計(jì)算出攻擊相對于自身的方向來源,并將該數(shù)據(jù)和擊中部位、受到的攻擊類型和攻擊時產(chǎn)生的沖量發(fā)送給處理角色動畫的模塊中去,動畫模塊根據(jù)角色受擊的方向、和受到的攻擊類型通知動畫狀態(tài)機(jī)來混入對應(yīng)的受擊動畫,再通過開啟擊中部位的物理模擬和沖量數(shù)據(jù)來反應(yīng)受擊部位的物理抖動效果。如果游戲設(shè)計(jì)上有些視覺沖擊效果的需求,也可判斷沖量超過一定部位承受閾值后,做一些受擊部位產(chǎn)生破碎或者斷裂的效果。受擊反饋系統(tǒng)的整體流程設(shè)計(jì)如圖4所示。
圖4 受擊反饋系統(tǒng)的流程圖
(1)攻擊檢測模塊,該模塊采用虛幻引擎的actor組件類型,在虛幻引擎中actor組件可以附加在所有actor類的派生類,因此采用該類型組件可以讓攻擊檢測功能復(fù)用在所有具有攻擊需求的角色類上,如圖5所示。模塊中需要初始化角色類上綁定的武器,在所依附的角色播放攻擊動畫時觸發(fā)攻擊檢測邏輯,并在有效擊中產(chǎn)生后,通過武器上插槽前一幀的位置和當(dāng)前幀的位置計(jì)算出當(dāng)前幀的攻擊方向,并收集擊中點(diǎn)的部位、攻擊類型的數(shù)據(jù)并通過攻擊類型和武器數(shù)據(jù)在利用結(jié)構(gòu)體創(chuàng)建的FAttackData數(shù)據(jù)表如表1中查找對應(yīng)攻擊的沖量數(shù)據(jù),再將攻擊方向,擊中點(diǎn)的部位、攻擊類型和攻擊類型所產(chǎn)生的沖量數(shù)據(jù)傳遞給被擊中角色的數(shù)據(jù)接收接口,同時調(diào)用播放打擊特效、受擊聲音特效、UI特效和屏幕震動的接口。該模塊同樣提供接口用以改變不同打擊特效、聲音特效、UI特效和屏幕震動來應(yīng)對不同的角色和不同的攻擊環(huán)境。
圖5 角色類自身組件圖
表1 FAttackData數(shù)據(jù)表
(2)可被攻擊接口,該類接口應(yīng)用與所有可被攻擊的角色類上,如圖6所示。接收攻擊對象身上攻擊檢測組件所發(fā)送的攻擊方向,擊中點(diǎn)的部位、攻擊類型和攻擊類型所產(chǎn)生的沖量數(shù)據(jù),通過當(dāng)前獲得的攻擊方向數(shù)據(jù)和當(dāng)前受擊角色在場景中的位置和旋轉(zhuǎn)信息計(jì)算出角色受擊的方向,再將角色受擊的方向、擊中點(diǎn)的部位、攻擊類型和攻擊類型所產(chǎn)生的沖量信息傳遞給角色的動畫模塊。
圖6 角色類自身接口實(shí)現(xiàn)圖
(3)動畫模塊,動畫模塊是依附于角色身上的動畫管理組件,同樣繼承于虛幻引擎的actor組件類,負(fù)責(zé)接收數(shù)據(jù)改變角色當(dāng)前的狀態(tài)來通知角色的動畫狀態(tài)機(jī)播放對應(yīng)的動畫狀態(tài)和調(diào)動擁有者的mesh來播放對應(yīng)的蒙太奇動畫。動畫管理組件自身帶有觸發(fā)多種角色動作情況時需要采用的處理邏輯,受擊情況也作為其中一種情況被處理。當(dāng)角色的動畫組件在接收到受擊數(shù)據(jù)后,通過可被攻擊接口傳遞過來的受擊方向、攻擊類型來調(diào)動擁有者的mesh組件通過蒙太奇播放對應(yīng)的受擊動畫片段,并通過獲得和使用蒙太奇上預(yù)先設(shè)定好的混合權(quán)重曲線來覺得受擊部位物理模擬的時間和模擬權(quán)重大小,再通過擊中點(diǎn)的部位、沖量數(shù)據(jù)來決定受擊角色受擊部位的物理抖動效果。
各模塊類關(guān)系圖如圖7所示。
圖7 受擊反饋系統(tǒng)類圖
本課題研究的受擊反饋系統(tǒng)對當(dāng)前主流的動作游戲的打擊感問題提出了解決方案,希望以流程化的方式完成人物受擊效果的實(shí)現(xiàn)。通過一個整體的框架完成主要受擊過程,再通過更改動畫數(shù)據(jù)、特效和音效資源來適應(yīng)每一個受擊個體。希望通過該系統(tǒng)的設(shè)計(jì)可以減少整體的代碼邏輯工作量,增加動作游戲受擊反饋的真實(shí)感,增強(qiáng)游戲代入感和整體的體驗(yàn)質(zhì)量。