本文首發(fā)“Unity官方平臺(tái)”公眾號 9 月初,由海彼游戲研運(yùn)的 Rogulike 休閑游戲,,《彈殼特攻隊(duì)》,,正式全平臺(tái)公測,隨即就成為了業(yè)內(nèi)焦點(diǎn),。該作不僅一度沖擊暢銷榜前 10,,更是實(shí)現(xiàn)了月流水破億的好成績! 《彈殼特攻隊(duì)》是一款畫風(fēng)簡潔卡通,,操作簡單的 2D Roguelike 割草手游,。玩家在大地圖中,依靠升級各類武器和技能,,來應(yīng)對鋪天蓋地而來的,、密密麻麻的怪物大軍,再輔以傷害顯示,,給玩家?guī)砹藰O具爽感的游戲體驗(yàn),。 首先,跟大家介紹一下《彈殼特攻隊(duì)》的團(tuán)隊(duì)和游戲創(chuàng)意來源吧,。 《彈殼特攻隊(duì)》的團(tuán)隊(duì)成員都是在游戲行業(yè)打拼多年的“老兵”,,不過長時(shí)間從事游戲行業(yè)并沒有磨滅大家對游戲的熱情,相反讓大家對于游戲可玩性有了更為苛刻的要求,,可以說是一群對游戲有著極端熱愛的“偏執(zhí)狂”,,如果一個(gè)玩法在團(tuán)隊(duì)內(nèi)沒有得到所有人的認(rèn)可,是不可能進(jìn)入到測試環(huán)節(jié)的,,甚至老板可能都不會(huì)見到,。 研發(fā)團(tuán)隊(duì)合影 我們的游戲主要是面向移動(dòng)端,,在經(jīng)過 Demo 原型的分析和體驗(yàn)后,我們對玩法進(jìn)行了大量的迭代調(diào)整: 我們把單局的時(shí)長控制在了 15 分鐘,,而且加入了戰(zhàn)斗自動(dòng)存檔,,使游戲更契合移動(dòng)端用戶的使用習(xí)慣。同時(shí),,整體時(shí)間的調(diào)整也會(huì)引起其他的調(diào)整,,時(shí)長縮短后在戰(zhàn)斗節(jié)奏也更加緊湊、刺激,,讓玩家的注意力更加集中,。 我們保留了《弓箭傳說》的豎屏視角和可以單手操控的特性。為了讓體驗(yàn)更好,,我們加了很多預(yù)警,,提示等一些小細(xì)節(jié)。這樣讓玩家能夠?qū)磳⒌絹淼奶魬?zhàn)有一些預(yù)期,,不會(huì)措手不及,。 除了玩法優(yōu)化,原型 Demo 最大的挑戰(zhàn)是性能,,我們希望盡可能保證同屏怪物的數(shù)量,,讓玩家能夠體驗(yàn)到“爽快割草”、“極限求生”,。為此我們的技術(shù)嘗試了很多方向,。最終我們選擇了 ECS 架構(gòu)。在整個(gè)團(tuán)隊(duì)的努力下,,最終,,原型在性能上達(dá)到了我們的預(yù)期。 《彈殼特攻隊(duì)》游戲場景中有大量的 object,,請問團(tuán)隊(duì)是如何做管理的呢,?同時(shí)我們了解到,該游戲使用了 Unity 的 DOTS 架構(gòu),,可以具體介紹一下團(tuán)隊(duì)是如何使用此架構(gòu)的嗎,? 海量怪物圍過來的體驗(yàn)非常棒,但是性能卻成為了我們不得不考慮的一個(gè)難題,。所以,,當(dāng)我們定下來這個(gè)游戲模式的時(shí)候,就著手準(zhǔn)備了,。在早期版本中,,我們嘗試過用之前寫的底層來做 demo,但是當(dāng)怪物數(shù)量到一個(gè)量級的時(shí)候性能下降的很嚴(yán)重,。后來我們技術(shù)討論的時(shí)候想起了之前 Unity 技術(shù)專家來我們公司做技術(shù)分享的時(shí)候提到的 DOTS 技術(shù),,在移動(dòng)端實(shí)現(xiàn)了大量單位同屏。所以決定轉(zhuǎn)用 DOTS 相關(guān)的技術(shù)來進(jìn)行 demo 的開發(fā),。 最開始我們是非常忐忑的,從 OOP 的思想轉(zhuǎn)換到 DOP 思想,,對于我們技術(shù)人員來說是一個(gè)新挑戰(zhàn),,再加上當(dāng)時(shí)我們找到 DOTS 相關(guān)的資料也不多,所以只能一步一步嘗試,。我們當(dāng)時(shí)找到的比較完善的 DOTS 版本是 0.17,,按照最初的想法摸索搭建了一個(gè)非常小的 demo。沒想到 DOTS 給了我們一個(gè)驚喜,,新demo做性能測試時(shí),,我們把數(shù)量參數(shù)調(diào)整到幾千只,都很順暢得跑下來了,。為了驗(yàn)證我們還特意嘗試了一些 15-16 年的老機(jī)型,,雖然開始有輕微掉幀的表現(xiàn),但是也沒壓力跑完了,。雖然 demo 的邏輯沒正式版本那么復(fù)雜,,但是實(shí)現(xiàn)了遠(yuǎn)超需求數(shù)量的怪物在低端機(jī)型上順利體驗(yàn),,這是我們意想不到的。 其實(shí),,我們首次上線測試開始的時(shí)候,,才趕上最新的 0.50 的發(fā)布,但是需要做的東西太多,,已經(jīng)來不及升級了,,索性就一直在用 0.17。關(guān)于自動(dòng)更新方面,,我們項(xiàng)目暫時(shí)還沒加入,。是有后續(xù)的打算。現(xiàn)在還沒有具體的確定方案,。 我們的核心需求是實(shí)現(xiàn)大量目標(biāo)在同一場景出現(xiàn),。在設(shè)計(jì)上我們把游戲內(nèi)需要展示出的內(nèi)容拆分為 4 部分:單位實(shí)體(如玩家和怪物);子彈實(shí)體,;特效,;文字。 Entities HybridRenderer 這兩個(gè)組合各有利弊,,最開始的時(shí)候我們想用純 Entities 實(shí)現(xiàn)全部內(nèi)容,但是后來發(fā)現(xiàn),,有很多游戲內(nèi)較復(fù)雜的邏輯用 OOP 的思路開發(fā)和維護(hù)起來更容易,,再加上時(shí)間倉促,渲染方面想轉(zhuǎn) URP 有點(diǎn)來不及,。所以我們最后把這兩個(gè)方向結(jié)合了起來,,一部分邏輯內(nèi)容依然放在依然使用原有的 GameObject Monobehaviour。另一部分耗性能高的運(yùn)算邏輯則放在 DOTS 層,,充分利用 Entities 的多線程,。這種設(shè)計(jì)方式加上我們 TA 的渲染優(yōu)化,就實(shí)現(xiàn)了現(xiàn)在的游戲邏輯?,F(xiàn)在來看,,已經(jīng)有了不錯(cuò)的性能表現(xiàn),但是其實(shí)我們?nèi)匀徊挥X得滿意,,后續(xù)我們?nèi)匀粫?huì)保持對游戲性能的進(jìn)一步優(yōu)化,。 傷害飄字部分主要基于兩個(gè)方面來考慮, 一是以后可能需要圖片 文字或者其他多變的藝術(shù)化文字來豐富和迎合整個(gè)游戲的卡通化風(fēng)格,,所以需要一定的美術(shù)擴(kuò)展性,。二是希望能很少批次就能渲染所有文字,因?yàn)閭︼h字的特征是單個(gè)文字頂點(diǎn)少,但量特別大,。綜合考慮我們確定了圖片 GPUInstance 的方案,,這樣不僅滿足性能和效果的需求,還更方便我們當(dāng)時(shí)項(xiàng)目結(jié)構(gòu)的管理,。 首先還是先要贊一下 DOTS 架構(gòu)的巧妙設(shè)計(jì)和便捷,,這套架構(gòu)極大的降低了使用成本。由于 C# 作為高級編程語言封裝得太好,,所以大多開發(fā)者對 unsafe 并不是特別熟悉,,想要寫出高效且安全的指針內(nèi)存操作無疑增加了很大的難度。DOTS 架構(gòu)上手簡單,,而且在學(xué)習(xí) DOTS 框架的同時(shí)也會(huì)對內(nèi)存,、指針、尋址,、數(shù)據(jù)存儲(chǔ)方式等提供更深的理解,,有利于對計(jì)算機(jī)基礎(chǔ)的學(xué)習(xí)。 如果說還有需要提升的方向,,可能想到的是對 ECS 部分的優(yōu)化,。因?yàn)閭鹘y(tǒng) GameObject 使用的是面向?qū)ο缶幊痰姆绞剑?ECS 使用的是面向數(shù)據(jù)編程方式,,從而增加了上手難度,。同時(shí) ECS 本身存在很多獨(dú)有的寫法和命令,比如 WithoutBurst Run 操作等,,這些也會(huì)在學(xué)習(xí)初期造成一定的困擾,。所以我個(gè)人覺得如果能夠使用面向?qū)ο缶幊痰乃季S來寫面向數(shù)據(jù)的邏輯,才真真是極好的,。 比如在 MonoBehaviour 中開放一個(gè)類似于 SystemBase 的功能,,雖然沒有可以移除和添加的功能和便捷的擴(kuò)展性,但是也可以滿足一部分的開發(fā)需求,,并且可以更好的引導(dǎo)開發(fā)者將 ECS 和 GameObject 系統(tǒng)看做一個(gè)整體而不是兩個(gè)獨(dú)立的架構(gòu),從而引導(dǎo)學(xué)習(xí)和了解的興趣,。 對于后續(xù)版本發(fā)布,,驚喜肯定是有的,不過相應(yīng)的制作難度也非常大,,可能還需要玩家們耐心地等待一段時(shí)間,。可以稍微透露一下,,未來的版本中我們會(huì)加入實(shí)時(shí)組隊(duì)的相關(guān)玩法,,并且會(huì)強(qiáng)調(diào)團(tuán)隊(duì)配合和策略性,。 |
|