本文為《死亡細胞》主設(shè)計師Sebastien Benard去年在Gamasutra發(fā)表的一篇探討“隨機性”和“可玩性”如何平衡和實踐的文章伍掀,原文地址戳這里刘莹。個人覺得他們在制作《死亡細胞》過程中總結(jié)的這一套方法論還是很有參考價值的,對于想做RogueLite游戲卻無從下手的開發(fā)者也很有啟發(fā)性目代,是比較難得的干貨文章屈梁。
大家好,我是Sebastien Benard榛了,目前在《死亡細胞》擔(dān)任首席設(shè)計師在讶,《死亡細胞》是一款由程序生成關(guān)卡的Metroidvania類游戲。
最近玩家和其他開發(fā)者詢問了我們很多程序隨機生成關(guān)卡質(zhì)量相關(guān)的問題霜大,也難怪构哺,最近關(guān)于游戲中程序生成和隨機性的討論甚囂塵上(我:可能是無人深空的鍋)。玩家們對程序隨機生成的懷疑態(tài)度也是情有可原战坤,況且Metroidvania類游戲在人們印象中曙强,核心就是設(shè)計師們一絲不茍小心翼翼設(shè)計的關(guān)卡。好吧途茫,接下來就讓我來回答大家的懷疑碟嘴,并深度探究下我們是如何在Metroidvania類游戲中加入roguelite可重復(fù)游玩元素的。如果你更喜歡視頻而不是讀長篇的文字囊卜,我們?yōu)槟銣?zhǔn)備了一段“精煉”版本的開發(fā)日志視頻娜扇。
(我轉(zhuǎn)載到B站了,不過并沒有字幕栅组,想看的戳這里)
在介紹具體步驟前雀瓢,我想聊下我們?yōu)槭裁聪氚?strong>程序隨機生成這一因素加入到Metroidvania這種需要精細關(guān)卡設(shè)計的游戲類型里。
兩年前玉掸,當(dāng)我們開始做《死亡細胞》的初版原型時刃麸,我們遵循了傳統(tǒng)的、手動制作關(guān)卡的方式排截。但問題接踵而至嫌蚤,我們很快發(fā)現(xiàn)按照這樣的制作速度,考慮到團隊的人數(shù)和規(guī)模断傲,做完和打磨好這款游戲顯得遙遙無期脱吱。
至此之后我們知道必須得尋找一個Plan B。在做《死亡細胞》前我們開發(fā)了很多網(wǎng)頁游戲箱蝠,大部分都包含了隨機元素和程序生成的特點,所以我們算是比較熟悉程序隨機核心概念的牙瓢。除此之外,程序隨機生成也被應(yīng)用到很多叫好又叫座的游戲里:《以撒》胁附、《Minecraft》控妻、《Starbound》等等弓候。受這些游戲激勵菇存,顯而易見撰筷,我們覺得至少得做一個原型,檢測下隨機性和《死亡細胞》的化學(xué)反應(yīng)井辆。
原型很成功杯缺,在永久死亡機制之上帶來了更多的可重玩性。一個更深刻的變化是塘揣,我們發(fā)現(xiàn)這個原型從基礎(chǔ)上改變了游戲里的戰(zhàn)斗感覺亲铡。將戰(zhàn)斗的重點放到玩家的隨機應(yīng)變和反應(yīng)上奖蔓,而不是通過機械背板來過關(guān)吆鹤『湟欤總而言之搭独,這個原型的感覺很棒牙肝。
但是配椭,也存在一些問題股缸,盡管隨機刷新敵人提升了核心游戲性敦姻,但關(guān)卡設(shè)計遭受了重創(chuàng)镰惦。簡而言之旺入,隨機關(guān)卡顯得混亂沒有條理茵瘾,讓你無法感受到整體性,也沒法沉浸到游戲世界中去聘殖。
即無法完全手工設(shè)計關(guān)卡奸腺,也不滿足于完全由程序生成關(guān)卡突照,我們覺得需要尋找一個折中的方案末盔。
這里我們得謝謝《洞穴探險Spelunky》團隊陨舱,他們也面臨過相同的問題,并提供了一些有趣的解決方案益缎。如果你有興趣的話莺奔,可以戳這里簡單了解下(需要梯子才能看)令哟±總而言之颓鲜,他們把手工制作關(guān)卡和程序生成混合在一起乐严,讓關(guān)卡同時具有多樣性和持續(xù)性捂敌。
在講具體的技術(shù)實現(xiàn)細節(jié)前,我還想提兩個讓《死亡細胞》深受啟發(fā)的游戲。
第一個是《Faster Than Light》:即擁有程序生成的隨機性奖慌,也擁有精心安排的情節(jié)和統(tǒng)一的宇宙世界觀。我們認為它是這類游戲的標(biāo)桿。
第二個是《求生之路Left For Dead》蛛枚,哈哈,是不是沒有想到。最開始的時候,《死亡細胞》原型是一個僵尸塔防游戲宇色,我們從《求生之路》的底層理念學(xué)習(xí)了不少東西甥捺,Valve為了解決重復(fù)游玩性構(gòu)造了一個AI Director系統(tǒng)皿曲,可以根據(jù)每局不同的情況隨機擺放普通和特殊僵尸坞古。你可以戳這里了解下基本概念,還是很有意思的听怕。
我們開始做自己的AI Director系統(tǒng)法挨,雖然那時候八字還沒一撇窃植,但我們確立遵循一個最基本的原則:這個系統(tǒng)構(gòu)造關(guān)卡時丛版,要圍繞穿插緊張刺激和放松獎勵的流程偏序,來確保游戲節(jié)奏錯落有致,從而讓玩家無法自拔胖替。
總結(jié)下我們的目標(biāo):創(chuàng)建一個融合了程序生成關(guān)卡的世界研儒,具有變化多樣性和重復(fù)游玩價值豫缨,難度建立在玩家對一個持續(xù)變化關(guān)卡的反應(yīng)而不是背板上。與此同時端朵,還必須在關(guān)卡和流程中保持一致性好芭,融入世界觀。汲取之前游戲的經(jīng)驗冲呢,經(jīng)過很多次的嘗試舍败,失敗,調(diào)整和不計其數(shù)的微調(diào)后敬拓,我們總結(jié)了六大步驟邻薯,希望能作為幫助你實現(xiàn)高質(zhì)量程序生成關(guān)卡的基礎(chǔ)。
-
首先乘凸,我們確定好固定的元素厕诡,在這個框架內(nèi)程序生成才會施展拳腳。整體的世界地圖設(shè)計营勤,不同關(guān)卡之間如何連接灵嫌,解鎖下一個關(guān)卡的鑰匙位置等等。不管游戲的隨機數(shù)種子如何變化葛作,這些元素都是手動設(shè)計寿羞,不會變化的。
-
接下來赂蠢,我們手動設(shè)計了一系列的房間塊绪穆,每個房間依據(jù)其配置項,可以充當(dāng)不同的用處客年。下面是我們在軟件CastleDB中建造的一些房間示例霞幅。
實踐中,每個房間塊的地形結(jié)構(gòu)都是為其用處而專門設(shè)計的量瓜。藏有寶箱的房間和商人房間構(gòu)造不同司恳,而這兩種房間又和戰(zhàn)斗房間結(jié)構(gòu)差別巨大。每個房間的屬性主要包括入口數(shù)量绍傲,是否有出口以及房間的用處扔傅。
每個房間還從屬于某個大關(guān):比如在監(jiān)獄房間塊就不會用在下水道場景中。這樣確保每關(guān)有自己的特色——比如下水道場景都很狹窄烫饼,限制了跳躍和回避的作用猎塞,迫使玩家合理安排他們的操作。
-
好了杠纵,既然有了一堆還算可以的房間塊荠耽,現(xiàn)在需要把他們用合理、有趣的方式安排起來比藻。我們?yōu)槊總€大關(guān)創(chuàng)建一張概覽圖铝量,用抽象節(jié)點表示房間塊倘屹,顯示出其中房間塊的數(shù)目和連接順序。先添加關(guān)卡開始節(jié)點和出口慢叨,然后添加一些特殊房間(寶箱纽匙,商人等等),最后在之間添加探索和戰(zhàn)斗的房間拍谐。
這張概覽圖作為下一步的程序生成算法的指導(dǎo)性基礎(chǔ)烛缔,定義了關(guān)卡的長度,特殊房間的數(shù)量轩拨,關(guān)卡的復(fù)雜度等等践瓷。每個大關(guān)都有張獨立的概覽圖以保持其風(fēng)格統(tǒng)一。比如比起下水道關(guān)气嫁,我們讓壁壘關(guān)更線性当窗,流程更直接。 -
在我們把這些條條框框和設(shè)計上的約束準(zhǔn)備好之后寸宵,我們的程序生成算法終于要登場了崖面。對于每個房間塊節(jié)點,程序在該大關(guān)的候選房間中隨機選擇一個房間梯影,并檢測是否符合概覽圖中的要求(入口位置巫员,入口數(shù)量,房間類型等等)甲棍。如果不符合简识,程序會重新嘗試另外的房間直到找到符合要求的。大功告……等等感猛,還有事情要做七扰。
-
玩家需要敵人來進行戰(zhàn)斗。每關(guān)的怪物數(shù)量是由每關(guān)的戰(zhàn)斗房間的戰(zhàn)斗Tile塊(我:這里應(yīng)該是每個戰(zhàn)斗房間標(biāo)記了放置怪物的戰(zhàn)斗Tile塊)決定的陪白,舉個隨機的例子颈走,在程序生成的下水道關(guān)中有250個戰(zhàn)斗塊。我們先定義每個戰(zhàn)斗房間中出現(xiàn)怪物的數(shù)量咱士,比如每5個戰(zhàn)斗塊出現(xiàn)一次立由,那整個關(guān)卡中就要放置50個怪物。
每種怪物也有自己對應(yīng)的屬性和限制序厉,比如有些更危險的怪物每10個戰(zhàn)斗塊出現(xiàn)一次锐膜,有些精英怪一整關(guān)都不能出現(xiàn)超過一次,有些不能和其他某種怪物一起出現(xiàn)弛房,有些則需要在有較大空間方便移動的地方出現(xiàn)道盏,等等不一而論。 -
最后一步就是生成金幣,細胞核心和掉落物捞奕。
好了牺堰,經(jīng)過上面的長篇大述拄轻,我們分享了自己的方法颅围,希望有人能汲取些有關(guān)程序隨機生成的思路。我也希望其他開發(fā)者們能敢于冒險勇于嘗試——像融合兩種看起來毫不相干的想法和思路恨搓。有時候會有奇效院促。
Cheers!