以虛幻GAS系統為核心的《原子之心》
大家好,我叫Andrey Dyakov,是即將上市的遊戲《原子之心(Atomic Heart)》的開發商Mundfish的技術總監。這篇技術部落格將講解一些我們用於開發這一作品的技術,重點講述我們如何利用虛幻的Gameplay Ability System(GAS)?改變我們的開發流程。
本文並非手冊,只是詳細介紹了我們的經驗。儘管如此,它還是能夠幫助可能已經很熟悉GAS而且在其專案中使用過它的開發者。
如今外面已經有更多關於GAS的資訊了,但我們想要介紹的是,我們在當初關於這個系統的文件和支援還不是很多的時候所作的一些研究。
那是在2018年,我們有自己的行動過濾器系統,用來區分玩家的行動和定義它們的執行規則,我們總體上對它很滿意。它讓我們能夠控制在玩家進行其他行動時能否開始特定玩家行動或者禁止其開始(例如在蹲下時跳躍)。
但它只是我們需要的眾多子系統之一。對我們來說,還需要解決其他關鍵開發問題,例如:
- 如何處理充能近戰武器和遠端武器的子彈所發出的酸液、電流和火焰造成的特殊傷害
- 如何堆疊和處理施加於一個角色的不同型別傷害
- 如何實現玩家角色的特殊能力,以及如何控制它們的執行流
- 最後,在我們最終決定將《原子之心》做成單機遊戲前,還考慮過如何處理聯機複製
有一個系統具備瞭解決所有這些問題的潛力:虛幻的Gameplay Ability System。我曾經用它準備了一個小型示例專案,用於我在一家外包公司給60個人講授了幾個星期的UE4開發課程。不過,在一個小型教學專案上試用當時還處於試驗階段的系統是一回事,把它應用於一個雄心勃勃的大型商業專案又是另一回事。
團隊最初有許多顧慮,這是完全可以理解的。那時候,Epic為GAS提供的支援很有限。你可能知道,這個外掛是Epic終止了它的《虛幻爭霸(Paragon)》專案之後放出的,最初它是那個遊戲的重要組成部分。但是我把這個事實視作當時GAS已經接近產品級要求的證明,我相信我們的團隊能夠應對填補差距的挑戰。幸運的是,我猜對了。
GAS外掛在描述中帶有[UNSUPPORTED]標記
當時是虛幻引擎4.20發行前後,網際網路上除了社群的熱心人寫的幾篇文章,沒有多少關於GAS的文件。我們就這樣開始了自己的研究。團隊檢查了這個外掛的每一行程式碼,在頭腦風暴討論會中交流了它的各種優點和缺點。
最終我們確定,GAS的許多功能如果整合到我們的遊戲中,是絕對有利的:
- 一切都可以通過遊戲性標記?(層級標記)來控制
- 所有的行動/技能都可以作為能力來開發
- 能力可以繫結到玩家的輸入
- 所有的效果(加強/削弱)都是一起堆疊和計算的
- 任何視覺效果反饋都可以通過遊戲性提示?來管理
與此同時,缺點也很明顯:系統很複雜,而且缺乏官方的文件與支援。GAS是一套複雜的系統,使用方法因公司、因專案而異。我們也花了一點時間才確定我們自己使用這個系統的最佳實踐。
在整合過程中,我們檢查了用於計劃目標的所有基本機制,全都做得非常好。此時我們也明白了,GAS可以完全取代我們的行動過濾器系統,因為它有相似卻更好的機制來控制能力執行。我們完成系統過渡之後,就開始把所有玩家行為遷移到獨立的能力,這使我們的AHBaseCharacter和AHPlayerCharacter類(是的,我們的類都帶有AH字首)大大簡化了。
這樣一來,我們就能建立許多能力,而不需要設計我們自己的能力系統的架構。這真的大大節省了時間。不過,我們新增的能力越多,遊戲性互連/依賴性就越複雜。
公正地說,我們在使用GAS的早期遇到了一些挑戰,但這些問題與開發和實現我們自己的系統不能相提並論。
我們的一次頭腦風暴討論會
在我們找到能力和效果設定的最佳公式後,一切就盡在掌握了。
最終,我們遵照這種新的思路,開始將AI角色的行動遷移到它們各自的能力。這簡化了我們的行為樹?,使我們能夠更靈活地使用我們資料驅動的AI管線設定角色。現在就來詳細說說我們的一些GAS實踐。
有些人可能還不熟悉這個系統,在一般的GAS管線中,主要有四種類:能力系統元件附屬於所有者,屬性集被定義為所有者的屬性,遊戲性效果可以應用於能力系統元件的所有者並修改屬性集中定義的屬性,最後是能力,也就是由遊戲性標記和效果控制的行動。還有一些可選的類,例如遊戲性任務(它是能力的子物件)和遊戲性提示(它幫助提供來自遊戲性效果的視覺反饋)。
遊戲性標記管理著所有這些
所以,首先應該詳細說說遊戲性標記。這個子系統被新增到UE4的時間還要早於GAS。通過它可以定義和使用層級標記(標籤),後者可以應用到物件並用於許多不同的用途,例如區分不同型別的傷害。
這張圖顯示了我們常用的遊戲性標記類別
在我們的遊戲中,嚴密組織遊戲性標記的層級是非常重要的。每一種能力都有其自身的能力標記(能力子樹)和自身的禁止標記(禁止子樹)。
把所有東西都組織起來有助於保持控制,可以在整個專案中始終以相同的方法來使用能力。
用於基本角色能力的遊戲性標記
禁止效果
在整合之初做出的一個決定幫助了我們替換行動過濾器,那就是使用禁止效果。這些效果可以由能力新增到角色,也可以直接來自其他地方。它們的唯一用途就是授予阻止能力啟用的標記。
RestoreStamina能力就是一例。它始終是一個應用RestoreStamina遊戲性效果的主動能力。這是一種無限期的效果。它的主要用途是每500毫秒向玩家角色的AttributeSet(一種特殊的類,指定GAS元件所有者的所有屬性都需要它)中定義的耐力屬性新增一個恆定的浮點值,從而恢復玩家角色的耐力。如果有任何其他能力向效果GE_RestoreStamina授予禁止標記“Prohibitions.RestoreStamina”,那麼該效果就會停止,因為在它的資源設定中就是這樣定義的(參見下面的截圖)。
我們遊戲中的大部分能力在應用了禁止該能力的禁止標記時都不會啟用。在《原子之心》這樣的遊戲中,玩家擁有50多種能力,有時候情況會非常複雜。
費用效果
在介紹我們除錯基於標記的能力執行規則/先決條件的方法之前,我要再分享一條關於費用效果的最佳實踐。如果你必須在執行某種能力時消耗某些資源,就需要這種效果,當然了,如果對能力指定了這樣的效果,在應用前就會相應地檢查。例如,在我們的遊戲中,有一個用於近身超重攻擊的能力會即時消耗耐力。如果玩家角色耗盡了耐力,就無法執行這個能力。但如果他有足夠的耐力,就可以執行這個能力,而且將會按照費用效果中指定的數值扣減耐力。
我們自己的除錯工具
在使用GAS進行開發的過程中,很容易積累許多能力、效果、標記和遊戲性提示。所以當我們新增新能力時,就必須把這一切都考慮在內。否則就很容易“在能力中卡死”,我們用這個術語來形容當前處於活動狀態的一種能力阻止了許多其他能力,導致使玩家事實上什麼都做不了的情況。為了解決這種問題,我們建立了一種非常簡單、但又能提供有用資訊的除錯訊息,它會顯示在視口中。它說明當前在玩家角色上應用的標記和效果。對於AI,我們也設計了在AI角色的位置顯示的視窗控制元件,其中包含同樣的資訊,而且還有相應的AI角色能力。
使用這種資訊,就可以輕鬆瞭解哪些標記/效果應該是活動的,哪些不是。所以大多數情況下,可以通過在編輯器中的遊戲效能力資源中新增資料修正的形式來輕鬆解決問題。
乍一看,這顯得很混亂,但每個視窗控制元件都是可以摺疊的,而且滑鼠移到上面就會高亮顯示。
總結
Gameplay Ability System推出後,過了一段時間才通過官方專案示例和直播再次獲得支援。如今有越來越多的開發者將這種系統整合到他們的專案中,並在社群中分享他們的知識。
我們團隊非常高興能獲得如此強大而出色的工具來幫助執行日常工作,希望我們在這篇部落格中描述的經驗能夠幫助或啟發其他開發者。
我們還要特別感謝JetBrains為我們提供了在開發中全程幫助我們的工具。
如果你有興趣更多地瞭解我們的工作進展,請在Twitter和Facebook上關注我們,並把《原子之心》新增到你的Steam願望單!
文中提及的相關連結
[1] Gameplay Ability System(GAS)
https://docs.unrealengine.com/zh-CN/InteractiveExperiences/GameplayAbilitySystem/index.html
[2] 遊戲性標記
https://docs.unrealengine.com/zh-CN/ProgrammingAndScripting/Tags/index.html
[3] 遊戲性提示
https://docs.unrealengine.com/en-US/BlueprintAPI/Ability/GameplayCue/index.html
[4] 行為樹
https://docs.unrealengine.com/zh-CN/InteractiveExperiences/ArtificialIntelligence/BehaviorTrees/index.html
來源:虛幻引擎
原文:https://mp.weixin.qq.com/s/fKoo5ns0EFeEsqbl6FnNXg
相關文章
- 【Unreal】虛幻GAS系統快速入門Unreal
- Linux 核心101:虛擬檔案系統的使命Linux
- 《原子之心》正式發售! 上市宣傳片曝光!
- 以vue依賴統計為核心的框架(函式),mveVue框架函式
- 剖析虛幻渲染體系(11)- RDG
- 剖析虛幻渲染體系-開篇說明
- 剖析虛幻渲染體系(15)- XR專題
- 剖析虛幻渲染體系(03)- 渲染機制
- UE-GAS CreateDefaultSubobject<UAbilitySystemComponent>返回為nullptrObjectNull
- 就為了一個原子操作,其他CPU核心罷工了
- 以Windows作業系統為例,詳解版本控制系統—Git的操作Windows作業系統Git
- 剖析虛幻渲染體系(01)- 綜述和基礎
- 剖析虛幻渲染體系(04)- 延遲渲染管線
- 剖析虛幻渲染體系(02)- 多執行緒渲染執行緒
- 以製造業為核心的數字化轉型
- 虛幻私塾的正確使用姿勢
- Zookeeper的核心:ZAB原子訊息廣播協議協議
- 你以為你以為的就是你以為的嗎
- 以微出行為核心,發展城市交通
- 《原子之心》神最佳化 耕升 RTX 4070 Ti 追風完美執行
- SDP | 以「資料」為核心,實現場的數智化
- 以個性化為需求如何選擇ITSM系統?
- 防火牆的虛擬系統防火牆
- UE虛幻引擎CSV轉ExcelExcel
- 以數賦能,中國系統讓資料治理脫虛入實
- 開發者以Band of Defenders為例談遊戲的系統建造遊戲
- 《原子之心》全新遊戲實機影片曝光 公佈國區解鎖時間遊戲
- 【逆水寒】多方任務系統的資訊架構與行為引導設計——以懸賞系統為例架構
- xenomai核心解析--雙核系統呼叫(三)--如何為xenomai新增一個系統呼叫AI
- 日誌: 分散式系統的核心分散式
- 分散式系統的核心問題分散式
- 祖龍娛樂首席藝術家劉冰:以虛幻引擎挑戰次世代巔峰
- 解缺芯之困以工匠之心靜待花開
- 【UE5】虛幻引擎入門
- 虛幻引擎5現已釋出!
- 【leetcode】134. Gas StationLeetCode
- 酒店傳媒系統的核心是什麼?視達盈為你解答!
- 網校系統原始碼作為搭建網校系統核心,如何選擇最重要!原始碼