游戲策劃ai設(shè)計(jì)學(xué)習(xí)03---基于角色分配的戰(zhàn)術(shù)ai設(shè)計(jì)
上一篇中講了戰(zhàn)術(shù)ai的選點(diǎn)策略,但在上一篇中只解決了ai在戰(zhàn)斗中如何選點(diǎn),如何評(píng)價(jià)每個(gè)點(diǎn)的價(jià)值的問題
基于選點(diǎn)策略的戰(zhàn)術(shù)ai設(shè)計(jì)
在實(shí)際游戲過程中,npc為什么要移動(dòng),什么情況下會(huì)移動(dòng),移動(dòng)時(shí)如何處理,攻擊行為在什么時(shí)候進(jìn)行這類具體的行為還沒有進(jìn)行設(shè)計(jì),但其實(shí)以傳統(tǒng)的行為樹設(shè)計(jì)思路也已經(jīng)可以實(shí)現(xiàn)了,即給每個(gè)npc一個(gè)行為樹/狀態(tài)機(jī)對(duì)各種需要應(yīng)對(duì)的情況進(jìn)行預(yù)設(shè)方案,然后用上一篇中的選點(diǎn)策略輔助npc的移動(dòng)行為。
這一篇中將會(huì)提出另一種ai戰(zhàn)術(shù)行為的解決方案,基于角色分配的方案
基于角色分配
首先理解何為角色,這里的角色也可以理解為職能,在游戲中有各種各樣的職能,有的是策劃定義好的職業(yè),有的是玩家游玩過程中的分工,這里統(tǒng)一將他們稱謂某種“角色”。舉個(gè)例子,在moba中有法師,有戰(zhàn)士,這些是基于策劃設(shè)定好的天生職業(yè),而在fps中有人充當(dāng)架槍的狙擊手,有人充當(dāng)沖點(diǎn)的沖鋒手,也有人進(jìn)行火力掩護(hù)等等,這些則是玩家根據(jù)情況需要自行分工并進(jìn)行的相對(duì)應(yīng)的行動(dòng)。
在ai設(shè)計(jì)中我們可以將這些所有的角色進(jìn)行進(jìn)一步抽象,他們都代表著某一個(gè)或某一套具體動(dòng)作,如法師在遠(yuǎn)處使用技能,戰(zhàn)士靠近玩家使用普攻,狙擊手在遠(yuǎn)處瞄準(zhǔn),沖鋒手沖入并持續(xù)攻擊。我們可以將這些行為制作成行為樹或是狀態(tài)機(jī),并以這樣的角色對(duì)他們進(jìn)行命名。這里為了舉例就以經(jīng)典的戰(zhàn)法牧角色分工為例設(shè)定一下三種角色和對(duì)應(yīng)的簡單行為樹:
戰(zhàn)士:積極靠近敵人,并使用普攻進(jìn)行傷害
法師:盡可能遠(yuǎn)離敵人,并使用技能進(jìn)行傷害
牧師:盡可能遠(yuǎn)離敵人,并使用技能為最低血量的角色進(jìn)行恢復(fù)
至此我們已經(jīng)完成了角色的設(shè)定,然后就來到了“分配”這也是和傳統(tǒng)行為樹設(shè)計(jì)不太一樣的部分,我們并不會(huì)將戰(zhàn)法牧的行為樹直接分配給具體的某一個(gè)npc,我們需要一種動(dòng)態(tài)的分配策略,這里就需要增加一個(gè)“控制者”可以是由關(guān)卡或其他更高的全局層面發(fā)起(因?yàn)樾枰@取很多數(shù)據(jù)進(jìn)行戰(zhàn)術(shù)判斷)
動(dòng)態(tài)分配控制者
這里我們假設(shè)即將開始一場(chǎng)遭遇戰(zhàn),我方有五個(gè)npc對(duì)方是五個(gè)實(shí)際玩家,基于我們的動(dòng)態(tài)角色分配方案,在游戲開始我們并不會(huì)給npc任何的默認(rèn)ai,只是在場(chǎng)上生成了五個(gè)具象的npc,這時(shí)候我們需要控制者對(duì)角色進(jìn)行初次分配,以讓每個(gè)npc可以行動(dòng)起來。初次分配規(guī)則可以根據(jù)項(xiàng)目具體情況和關(guān)卡需求進(jìn)行設(shè)定,這里做一個(gè)簡單的通用規(guī)則
首先分配X個(gè)法師(具體根據(jù)需要)
然后分配Y個(gè)戰(zhàn)術(shù)
將剩余角色分配為牧師
這個(gè)分配方案目的是確保npc團(tuán)隊(duì)能夠有足夠多的輸出,有富余的情況下再進(jìn)行回復(fù)的基礎(chǔ)戰(zhàn)術(shù)策略。然后遭遇戰(zhàn)開始,在戰(zhàn)斗過程中會(huì)出現(xiàn)以下幾種情況會(huì)讓控制者對(duì)角色進(jìn)行再次分配
npc不適合再進(jìn)行此角色的行為:如牧師或法師來到了玩家身旁(主動(dòng)或被動(dòng)),此時(shí)會(huì)由控制者分配給他們戰(zhàn)士的角色,從而達(dá)到,玩家靠近時(shí)會(huì)切換成近戰(zhàn)攻擊的邏輯的效果
npc無法再擔(dān)任此角色:npc被擊殺,此時(shí)原有的分配比例就會(huì)缺失,需要控制者進(jìn)行彌補(bǔ),即團(tuán)隊(duì)中只有兩個(gè)戰(zhàn)士坐前排,而此時(shí)兩個(gè)戰(zhàn)士都死了,就再將戰(zhàn)士角色分配給后排的法師和牧師保持戰(zhàn)術(shù)隊(duì)形。(這里需要策劃進(jìn)行判斷規(guī)則的補(bǔ)充,后面會(huì)詳細(xì)補(bǔ)充)
npc無法再進(jìn)行角色的職能行為:如法師放技能沒藍(lán)了,放不了技能了,此時(shí)npc會(huì)歸還法師的角色,變成空角色,而控制者重新分配新的合適的角色給此npc
控制者在整個(gè)流程中起到兩個(gè)作用:①在戰(zhàn)斗初期根據(jù)策劃預(yù)設(shè)的比例給“不確定人數(shù)”的實(shí)際npc團(tuán)隊(duì)初始人數(shù)配給,這里的意義在于配置了通用規(guī)則后,不管npc團(tuán)隊(duì)是10人還是100人都能以一定規(guī)則獲得比較符合策劃預(yù)期的職能架構(gòu);②在戰(zhàn)斗中根據(jù)實(shí)際情況切換或重新分配戰(zhàn)場(chǎng)的角色安排,從而讓每個(gè)npc都能在合適的情況下進(jìn)行合適的行為
但看到這里會(huì)發(fā)現(xiàn),其實(shí)以上內(nèi)容用傳統(tǒng)行為樹也可以做到,只需要讓每個(gè)npc的行為樹中都配置三種職能,然后設(shè)置切換條件等也可以實(shí)現(xiàn)大致相同的效果。
到這里其實(shí)我們可以將角色分配的概念進(jìn)一步抽象,來強(qiáng)化表現(xiàn)“控制者-角色”這一體系的特點(diǎn)。我們可以將更細(xì)節(jié)的行為設(shè)定為角色,如攻擊,我們可以將攻擊這一行為變成“攻擊者”這一角色,這意味著只有當(dāng)npc拿到攻擊者這一角色時(shí)才可以進(jìn)行攻擊。
此處有一個(gè)隱含的規(guī)則,角色并不是單一的,就像現(xiàn)實(shí)和游戲中都是如此,一個(gè)人可以是父親也可以同時(shí)是老師是納稅人是男性,每個(gè)具體npc都可以同時(shí)擁有多個(gè)角色,而每個(gè)角色都是一部分的行為樹,具體的npc根據(jù)自己被分配到的角色(行為樹)拼接出他實(shí)際的行為
通過攻擊者這一設(shè)定,我們可以用這套體系實(shí)現(xiàn)很多rpg中的群毆戰(zhàn)斗,如在中土世界中,有大量的怪物圍著你,但只有幾個(gè)會(huì)進(jìn)行攻擊;在鬼泣中屏幕外的怪物不會(huì)攻擊你等等,我們只需要配置攻擊者的賦予規(guī)則和賦予上限,就可以達(dá)到不管場(chǎng)上有多少npc,玩家所承受的輸出難度和被攻擊程度是恒定符合設(shè)計(jì)預(yù)期的。
同樣的攻擊者也會(huì)存在無法履行職責(zé)的情況,如fps中,存在10個(gè)npc,賦予其中3個(gè)npc攻擊者的角色,他們進(jìn)行開火,而當(dāng)其中有npc沒子彈時(shí)會(huì)進(jìn)行換彈,此時(shí)他已經(jīng)無法履行攻擊者的職責(zé),歸還了攻擊者的角色,而控制者需要保證嘗試有3個(gè)npc被分配攻擊者的角色,從而將另一個(gè)npc分配為攻擊者。這樣就達(dá)成了從玩家視角看來的幾個(gè)npc交替開火互相掩護(hù)換彈,持續(xù)保持輸出火力的集體戰(zhàn)術(shù)行為。
設(shè)計(jì)架構(gòu)
結(jié)構(gòu)特點(diǎn)
在這套設(shè)計(jì)中我們可以將行為樹和狀態(tài)機(jī)細(xì)分成具體某一個(gè)行為的小型執(zhí)行器,將其封裝為一個(gè)角色,后續(xù)都對(duì)角色進(jìn)行操作。而將傳統(tǒng)行為樹中對(duì)情況的判斷,升格成一個(gè)全局的“控制者”根據(jù)不同情況將不同角色分配給具體npc,整體和傳統(tǒng)行為樹類似,但不同在于
通過全局的“控制者”這一概念,讓所有npc的行動(dòng)有了集體性,如開火的例子中,通過全局的分配規(guī)則讓輸出行為更加符合群體交錯(cuò)火力的概念
通過封裝角色這一概念,策劃和程序的實(shí)現(xiàn)其實(shí)更加便利,在實(shí)際的關(guān)卡實(shí)踐中,不需要策劃再去一個(gè)個(gè)行為樹設(shè)計(jì),而是從源頭設(shè)計(jì)出多種“角色”然后制定分配規(guī)則。當(dāng)策劃想要加一個(gè)通用行為時(shí),不再需要去修改所有的行為樹,而是實(shí)現(xiàn)這個(gè)新行為,然后在全局的“控制者”中增加此角色的賦予規(guī)則
第二點(diǎn)中可以舉一個(gè)例子,以fps為例,我們以這一套體系設(shè)計(jì)了一套基礎(chǔ)的npcai,然后在游戲后期,我們?cè)黾恿送稊S物,如閃光彈,燃燒瓶,手雷等。這個(gè)時(shí)候我們希望ai也能學(xué)會(huì)扔手雷,通過這套體系,我們不需要去修改任何一顆具體的行為樹,而是設(shè)計(jì)出什么情況下扔什么投擲物(即設(shè)計(jì)各種擲彈者的角色),然后在控制者中對(duì)這些角色的分配規(guī)則進(jìn)行設(shè)定,就完成了將擲彈邏輯加入到所有npc的行為中的配置內(nèi)容
分配角色和交還角色
在上述描述中,不難發(fā)現(xiàn),角色的分配,其實(shí)是雙向,當(dāng)npc不能開槍時(shí)他會(huì)主動(dòng)交還攻擊者的角色,也可以理解為他向控制者申請(qǐng)將這個(gè)角色收回。
這里的運(yùn)行邏輯其實(shí)可以用狀態(tài)機(jī)進(jìn)行理解會(huì)更加符合,每一個(gè)角色都是一套狀態(tài)機(jī),狀態(tài)機(jī)存在一個(gè)脫出的條件,即以射擊為例,沒彈藥了就是其中之一的脫出條件,npc被分配到了攻擊的角色(狀態(tài)機(jī)),執(zhí)行過程中沒彈藥了,觸發(fā)了狀態(tài)機(jī)的脫出條件,就從攻擊狀態(tài)中脫離出來
總結(jié)
這套設(shè)計(jì)還并不是很完全,更多時(shí)候還是要和別的設(shè)計(jì)搭配在一起,如之前的選點(diǎn)策略,這一篇的設(shè)計(jì)更加聚焦于具體的行為,和行為間如何切換的判斷。
而在角色設(shè)定上其實(shí)可以根據(jù)實(shí)際需求更加diy設(shè)定,主要核心還是全局的控制者去控制各種角色分配,從而讓一群npc看起來像是有組織有紀(jì)律而不是自己打自己的
在控制者的設(shè)置上,因?yàn)檫@一層是偏向全局的,可以根據(jù)需要設(shè)定更多限制,甚至于上一篇中的選點(diǎn)邏輯也可以在控制者中進(jìn)行一定的限制或傾向。
同時(shí)在一些大型游戲的制作中,控制者的全局設(shè)置也可以進(jìn)行模糊設(shè)置,即設(shè)定范圍或保底量,上限值等,意義在于確保整個(gè)游戲龐大的流程中游戲體驗(yàn)是統(tǒng)一的,但統(tǒng)一之中又可以給每個(gè)關(guān)卡具體的設(shè)計(jì)師就有設(shè)計(jì)的空間
比如在全局中我設(shè)定了攻擊者人數(shù)的上限是20,就意味著整個(gè)游戲最強(qiáng)的火力輸出也不會(huì)大于這個(gè)點(diǎn),而具體是多少則由具體關(guān)卡的設(shè)計(jì)者根據(jù)需要進(jìn)行設(shè)定