行為決策系統(tǒng):龍騰世紀(jì)的實(shí)用評(píng)分架構(gòu)

31.1 Introduction
? ? 龍騰世紀(jì)的實(shí)時(shí)戰(zhàn)斗序列使玩家得以控制英雄審判者同死靈、惡魔和巨龍戰(zhàn)斗。這是一個(gè)艱巨的任務(wù),但玩家并不孤單,同玩家一起戰(zhàn)斗的還有三個(gè)AI控制的單位——The Iron Bull,身材高大的斧頭雇傭兵;瓦里克·特瑟拉斯(Varric Tethras),一個(gè)輕聲細(xì)語的矮人;多利安·帕烏斯(Dorian Pavus),一個(gè)迷人而機(jī)靈的法師。
? ? 在龍騰世紀(jì)中,戰(zhàn)斗是由“能力(abilities)”驅(qū)動(dòng)的。一個(gè)典型的戰(zhàn)士擁有2到20種能力,從簡(jiǎn)單的“用持有的武器攻擊敵人”到精心設(shè)計(jì)的“向敵人進(jìn)行火力覆蓋”。每種能力都有相應(yīng)的“費(fèi)用”,這些“費(fèi)用”以“法力”或“耐力”之類的可消耗資源表示。由于法力/耐力是有限的,所以能力也具有隱含的機(jī)會(huì)成本——當(dāng)前能力會(huì)消耗的法力/耐力不可避免的會(huì)影響之后可能會(huì)使用的能力的選擇。這在玩家和AI單位形成了一個(gè)具有挑戰(zhàn)的問題:當(dāng)面臨有限的資源,多種選擇以及不斷變化的游戲狀態(tài)時(shí),戰(zhàn)士如何迅速確定將產(chǎn)生最大可能收益的行動(dòng)方案?對(duì)龍騰世紀(jì),我們創(chuàng)建了一個(gè)基于實(shí)用性的AI系統(tǒng),稱為行為決策系統(tǒng)(BDS),以應(yīng)對(duì)該問題并處理戰(zhàn)士必須執(zhí)行的復(fù)雜決策。 在本章中,我們將描述BDS的原理和體系結(jié)構(gòu),為您提供實(shí)施類似系統(tǒng)并擴(kuò)展其滿足您自己游戲需求的必要信息。
31.2?The Behavior Decision System
? ? BDS系統(tǒng)架構(gòu)由以下幾條假設(shè)組成:
在任何給定時(shí)間,AI角色都可以執(zhí)行有限的一組動(dòng)作。
一個(gè)AI單位在同一時(shí)間只能執(zhí)行一個(gè)動(dòng)作。
動(dòng)作具有不同的效用值,有些動(dòng)作比其他動(dòng)作更有效。
可以量化每個(gè)動(dòng)作的效用。
? ? 綜合考慮,基于這些假設(shè)自然而然能想到通過一個(gè)簡(jiǎn)單的貪心算法來確定AI單位的最佳行動(dòng)方案:首先確定合法可采取的行動(dòng)。然后,評(píng)估每個(gè)動(dòng)作并根據(jù)其效用為其分配分?jǐn)?shù)。 在評(píng)估完每個(gè)動(dòng)作之后,得分最高的動(dòng)作就是應(yīng)該采取的動(dòng)作(Graham 2014)。
? ??這種方法有兩個(gè)主要挑戰(zhàn)。 首先,一個(gè)AI角色如何枚舉它可以執(zhí)行的所有動(dòng)作? 其次,AI角色如何限定動(dòng)作的效用? 在AI角色可以應(yīng)對(duì)這些問題之前,我們必須首先賦予它知識(shí)——對(duì)自身及其所處世界的知識(shí)。
? ? 例如,考慮一個(gè)簡(jiǎn)單的動(dòng)作,例如“喝生命藥水”。大多數(shù)人類玩家都知道,健康狀況不佳時(shí)喝生命藥水很有用。不幸的是,AI角色無法直觀地理解生命,死亡,健康和治愈藥水等概念。他們不知道活著是“好”,而死是“壞”。 他們不了解在健康狀況低下喝生命藥水是好的,在健康狀況下喝生命藥水是浪費(fèi)的。 而且他們不理解生命藥水是消耗品,除非擁有生命藥水,否則不能喝生命藥水。
? ? 在最基本的層次上,BDS是一個(gè)框架,允許游戲設(shè)計(jì)師將知識(shí)傳授給AI角色。具體來說,BDS的存在是為了應(yīng)對(duì)以下這些問題:AI角色可以執(zhí)行哪些動(dòng)作?他們?cè)谑裁辞闆r下可以執(zhí)行這些動(dòng)作? 應(yīng)該如何處理這些動(dòng)作之間的優(yōu)先級(jí)?最后:這些動(dòng)作實(shí)際上如何執(zhí)行?
31.3?Enumerating Potential Actions
? ? 在DA:I中有超過60種能力,但其中許多能力可以以不同的方式來實(shí)現(xiàn)不同的目的。例如,“Charging Bull”能力可以讓戰(zhàn)士沖進(jìn)戰(zhàn)場(chǎng)中,造成傷害并擊退任何阻擋在路徑上的敵人。這是預(yù)期的、明顯的目的。但是,這種相同的功能也可以用作受傷的戰(zhàn)士快速撤離戰(zhàn)斗的一種方式。盡管基本能力是相同的,但使用該能力的動(dòng)機(jī)卻可以完全不同。因此,在列舉潛在動(dòng)作時(shí),僅計(jì)算角色可使用的能力數(shù)量是不夠的——我們還必須包括執(zhí)行這些能力的各種方式。為了區(qū)分使用能力的各種場(chǎng)景,我們定義了一種稱為“行為片段”的數(shù)據(jù)結(jié)構(gòu)。
? ? 行為片段是BDS運(yùn)行的基本單位。每個(gè)片段均包含AI角色以特定方式評(píng)估和執(zhí)行能力所需的信息。從某種意義上講,片段代表了知識(shí)的一部分,并且在整個(gè)游戲中,可以通過BDS將片段“注冊(cè)”到角色,從而將知識(shí)授予角色。例如,一件武器可能附帶一個(gè)或多個(gè)行為片段,這些片段告訴AI角色如何使用該武器。當(dāng)AI角色裝備武器時(shí),這些片段將通過BDS注冊(cè)到角色。類似地,當(dāng)不配備武器時(shí),片段將從該角色中取消注冊(cè)。
? ? 行為片段使BDS可以簡(jiǎn)單地枚舉角色可用的動(dòng)作列表。 只需查看一組已注冊(cè)的片段即可。DA中最復(fù)雜的AI角色:同時(shí)注冊(cè)了50多個(gè)行為片段,平均每個(gè)AI角色將注冊(cè)10–20個(gè)片段。
31.4 Evaluating Behaviors
? ? 一個(gè)行為片段包含Ai角色在特定場(chǎng)景下需要評(píng)估和執(zhí)行能力所需的信息——但這究竟意味著什么?如前所述,BDS基于以下假設(shè):可以量化每個(gè)動(dòng)作的效用。為了使這種假設(shè)成立,每個(gè)行為片段都必須在其中包含一種量化其所代表動(dòng)作的效用的方法。量化效用的方法有很多種,但是對(duì)于DA,我們選擇使用經(jīng)過修改的行為樹(稱為“評(píng)估樹”)來表示效用。
31.4.1 Calculating Utility
? ? 用最廣泛的術(shù)語來說,評(píng)估樹的目的僅僅是為其相關(guān)的行為片段生成一個(gè)得分值。之后這些分?jǐn)?shù)會(huì)被當(dāng)做比較兩個(gè)行為片段的基礎(chǔ),以對(duì)它們的有效性進(jìn)行排名。得分值是通過嵌入評(píng)估樹本身的“得分節(jié)點(diǎn)”分配而來的。當(dāng)樹從其根節(jié)點(diǎn)開始執(zhí)行時(shí),得分初始值為零。當(dāng)樹從一個(gè)節(jié)點(diǎn)前進(jìn)到下一個(gè)節(jié)點(diǎn),它執(zhí)行的任何計(jì)分節(jié)點(diǎn)都會(huì)將其值添加到樹的總分。
? ? 評(píng)估樹是“在上下文中”進(jìn)行評(píng)估的,也就是說,樹中的節(jié)點(diǎn)可以訪問諸如正在執(zhí)行評(píng)估的AI角色之類的信息。這樣就可以創(chuàng)建一個(gè)可以根據(jù)不同“上下文”場(chǎng)景產(chǎn)生相對(duì)應(yīng)分?jǐn)?shù)的評(píng)估樹。(Merrill 2014)。例如,圖31.1顯示了一個(gè)評(píng)估樹,如果評(píng)估角色的生命值小于50%,它將返回5分,否則返回0分。

? ??在構(gòu)建評(píng)分系統(tǒng)時(shí),我們考慮了各種用于評(píng)分值自動(dòng)歸一化或縮放的方案。最終,我們選擇使用(并建議使用)面向設(shè)計(jì)師的評(píng)分規(guī)則,來提供一個(gè)規(guī)范動(dòng)作之間如何進(jìn)行評(píng)分的框架。注意,這些規(guī)則是內(nèi)容創(chuàng)建者的指導(dǎo),在游戲數(shù)據(jù)中沒有明確的表示。表31.1給出了一個(gè)示例。

? ? 設(shè)計(jì)者有責(zé)任為每個(gè)代碼片段構(gòu)建評(píng)估樹,有條件地分配分?jǐn)?shù),以使樹在適當(dāng)?shù)姆秶鷥?nèi)動(dòng)態(tài)生成值。在DA中,每個(gè)動(dòng)作類別使用一組不同的評(píng)分邏輯資產(chǎn)(scoring logic assets),以返回適當(dāng)范圍內(nèi)的分值。例如,“Support”動(dòng)作的評(píng)估樹擁有25個(gè)初始基準(zhǔn)點(diǎn),然后在上下文環(huán)境中有條件的提升到最高值45。
31.4.2 Target Selection
? ? DA中大多數(shù)能力都需要有一個(gè)目標(biāo)來驅(qū)動(dòng)。例如,一個(gè)AI角色不能簡(jiǎn)單地“施放獻(xiàn)祭”這個(gè)動(dòng)作,他們必須對(duì)特定敵人進(jìn)行該動(dòng)作。選擇的目標(biāo)會(huì)影響執(zhí)行的能力的結(jié)果(即效用值)??紤]:向虛弱的目標(biāo)施放獻(xiàn)祭會(huì)造成重大傷害,而對(duì)具有免疫力的目標(biāo)施放獻(xiàn)祭只會(huì)浪費(fèi)法力。因此,目標(biāo)選擇是評(píng)估步驟的必要部分。 為了準(zhǔn)確表示某項(xiàng)行動(dòng)的價(jià)值,我們必須考慮該行動(dòng)的所有潛在目標(biāo),然后選擇可以提供最大效用價(jià)值的目標(biāo)。因此,BDS系統(tǒng)不僅僅返回一個(gè)值,還包括一個(gè)目標(biāo)。
? ? 評(píng)估樹的上下文性質(zhì)允許我們可以通過引入“目標(biāo)選擇器”節(jié)點(diǎn)來添加目標(biāo)選擇邏輯。該節(jié)點(diǎn)遍歷設(shè)計(jì)師指定的目標(biāo)列表,分別評(píng)估和指定分?jǐn)?shù)。圖31.2展示了一個(gè)使用目標(biāo)選擇器節(jié)點(diǎn)的評(píng)估樹。

? ? 目標(biāo)選擇器節(jié)點(diǎn)維護(hù)其當(dāng)前臨時(shí)評(píng)估狀態(tài)(evaluation state)和記錄表(record table),并根據(jù)以下算法執(zhí)行:
將評(píng)估上下文(evaluation context)的當(dāng)前分值記錄為“初始分值”。
對(duì)于迭代器數(shù)據(jù)指定的每個(gè)可定位目標(biāo)(targetable):
將上下文的分值重置為初始分值。
將上下文的“行為目標(biāo)迭代器”插槽到當(dāng)前可定位目標(biāo)上。
評(píng)估孩子節(jié)點(diǎn)。
如果孩子節(jié)點(diǎn)返回 true,則記錄迭代器當(dāng)前可定位目標(biāo)的上下文分值。
如果至少一個(gè)可定位目標(biāo)有被記錄的評(píng)估分值:
將上下文的分值最高的行為目標(biāo)(Behavior Target)插槽到可定位目標(biāo)上。
將上下文的分值設(shè)置為與該目標(biāo)相關(guān)聯(lián)的分值。
返回 true。
如果沒有記錄有評(píng)估分值的可定位目標(biāo),則返回 false。
? ? 在這種方式下,通過比較多個(gè)目標(biāo),選擇其中能在每個(gè)行為片段上得到最高分值的目標(biāo),讓其與BDS核心評(píng)估表對(duì)應(yīng)的行為片段進(jìn)行關(guān)聯(lián)。
31.4.3 Comparing Snippets
? ? 作為AI角色更新的一部分,每個(gè)已注冊(cè)行為片段的評(píng)估樹都會(huì)運(yùn)行,并將由該樹生成的分?jǐn)?shù)和目標(biāo)與代碼段一起存儲(chǔ)在摘要表中。運(yùn)行完所有評(píng)估樹后,將選擇記錄分?jǐn)?shù)最高的片段來執(zhí)行。 通常在AI的每個(gè)更新周期中循環(huán)執(zhí)行此操作,但可以根據(jù)需要選擇性執(zhí)行。列表31.1包含此評(píng)估步驟的偽代碼實(shí)現(xiàn)。

31.5 Execution Step
? ? 確定了得分最高的片段和它能力的目標(biāo)后,最后一步就是執(zhí)行該片段。正如每個(gè)片段都包含一個(gè)評(píng)估樹以顯示應(yīng)如何評(píng)估該行為一樣,它也包含一個(gè)行為樹(稱為“執(zhí)行樹”(execution tree))以顯示應(yīng)如何執(zhí)行該行為。執(zhí)行樹負(fù)責(zé)為一個(gè)動(dòng)作在其播放動(dòng)畫和游戲邏輯之前,處理好所需的全部準(zhǔn)備或定位——該動(dòng)作的“主動(dòng)執(zhí)行(active execution)”。
? ? 如評(píng)估樹一樣,執(zhí)行樹在被執(zhí)行期間可以訪問上下文信息。具體來說,BDS會(huì)公開在評(píng)估階段被選擇的目標(biāo)的信息,以及同該片段相關(guān)聯(lián)的能力。為了簡(jiǎn)化執(zhí)行樹,我們定義了一個(gè)名為“執(zhí)行能力(Execute Ability)”的任務(wù)節(jié)點(diǎn),該節(jié)點(diǎn)功能為激活A(yù)I角色,使其執(zhí)行針對(duì)上下文指定的目標(biāo)使用上下文指定的功能。圖31.3顯示了一個(gè)典型的“移至范圍內(nèi)并攻擊”的執(zhí)行樹。

? ? 在上下文中存儲(chǔ)有關(guān)能力和目標(biāo)的信息(而不是在執(zhí)行樹中顯式引用它們)可使執(zhí)行樹保持通用性,從而使它們可在多個(gè)不同的片段中復(fù)用。例如,圖31.3所示的執(zhí)行樹可以應(yīng)用于“猛擊”、“刺擊”或“撕咬”等能力——只要該行為屬于近戰(zhàn)。
? ? 在每次AI更新階段,將執(zhí)行在先前BDS評(píng)估階段中選擇的行為片段的執(zhí)行樹,直到觸發(fā)“Execute Ability”節(jié)點(diǎn),表明該行為的執(zhí)行已完成。然而,在AI角色執(zhí)行特定片段時(shí)候,BDS可以繼續(xù)進(jìn)行評(píng)估階段。以這種方式進(jìn)行重新評(píng)估(Reevaluating),可以使AI角色適應(yīng)不斷變化的環(huán)境,及時(shí)更新并執(zhí)行新的不同的片段,而不會(huì)盲目的執(zhí)行已經(jīng)選定的過時(shí)的片段。實(shí)際上,評(píng)估和執(zhí)行邏輯之間的協(xié)約是一個(gè)評(píng)估樹,且該樹負(fù)責(zé)識(shí)別和防范執(zhí)行樹指令無法正常執(zhí)行的情況。在無法完成執(zhí)行樹的情況下(例如,如果執(zhí)行目標(biāo)在使用該能力之前就死了),則重新評(píng)估可確保將當(dāng)前無效的片段被替換為有效的片段。話雖這么說,一旦一個(gè)AI角色觸發(fā)了“執(zhí)行能力(Execute Ability)”節(jié)點(diǎn),就可以暫停AI更新,直到該能力完成執(zhí)行為止。 這樣就不會(huì)浪費(fèi)資源在那些“AI角色被占用時(shí)無法使用”的決策。
31.6 Movement and Passive Behaviors
? ??盡管BDS最初旨在優(yōu)先處理,準(zhǔn)備和執(zhí)行離散的動(dòng)作,但是在開發(fā)DA的過程中,我們發(fā)現(xiàn)BDS評(píng)估執(zhí)行框架對(duì)于調(diào)節(jié)正在進(jìn)行的或“被動(dòng)的”行為也很有用。
? ? 例如,在DA中,如果玩家的AI隊(duì)友無事可做,那么無論玩家走到哪里,他們都只會(huì)跟隨玩家。這個(gè)行為通過注冊(cè)一個(gè)片段到BDS中來實(shí)現(xiàn),該片段的評(píng)估樹返回一個(gè)比任何動(dòng)作都要低的固定分?jǐn)?shù)”(例如,在表31.1的評(píng)分系統(tǒng)中分?jǐn)?shù)為0),并且該執(zhí)行樹只會(huì)觸發(fā)“跟隨領(lǐng)隊(duì)”這一行為。這個(gè)片段會(huì)在其優(yōu)先級(jí)達(dá)到最高時(shí)由BDS自動(dòng)調(diào)用(即,沒有其他分?jǐn)?shù)大于0的片段是可執(zhí)行的)。
? ? 該方法的進(jìn)一步應(yīng)用——就像戰(zhàn)斗能力那樣——通過條件化評(píng)分邏輯,使BDS在上下文相關(guān)的運(yùn)動(dòng)行為之間進(jìn)行選擇。DA通過這種方法來對(duì)跟隨者的行為進(jìn)行變化,在戰(zhàn)斗時(shí)或者命令跟隨者前往某個(gè)確定的位置。這些有條件的評(píng)估方法比基礎(chǔ)行為具有更高的優(yōu)先級(jí),同時(shí)處于激活行為的次一級(jí)地位。
? ? 該方法對(duì)創(chuàng)建具有高優(yōu)先級(jí)的行為片段也十分有效,因?yàn)檫@會(huì)抑制其他可行的行為。DA使用這種方法來讓角色留在休息區(qū)。對(duì)于這些角色,我們創(chuàng)建了一個(gè)行為片段,其執(zhí)行樹會(huì)迫使AI角色返回其指定區(qū)域的中心。相應(yīng)的評(píng)估樹返回的分?jǐn)?shù)高于任何其他戰(zhàn)斗能力,但僅當(dāng)角色位于其指定區(qū)域之外時(shí)才返回。通過這種方式,可以確保當(dāng)AI單位偏離指定位置太遠(yuǎn)時(shí),可以立即脫離當(dāng)前目標(biāo)并返回,而不是越跑越遠(yuǎn)。
31.7 Modularity and Opportunities for Reuse
? ? 通過使用行為片段,BDS強(qiáng)調(diào)了AI設(shè)計(jì)的模塊化方法。模塊化方法有幾個(gè)好處。在調(diào)試時(shí),它允許開發(fā)者輕松地隔離特定行為的評(píng)估邏輯,或通過檢查評(píng)估步驟的結(jié)果來比較AI角色的相對(duì)優(yōu)先級(jí)。
??模塊化設(shè)計(jì)還能夠使行為在AI角色和原型之間輕松的遷移和共享。DA:我利用這一特性讓人類玩家能夠自定義它們的AI同伴。在整個(gè)游戲中,玩家可以添加、移除和修改AI角色的裝備和能力。通過將行為片段與裝備和能力資產(chǎn)綁定,并遵循一致的評(píng)分系統(tǒng)(如第31.4.1節(jié)所述),我們可以確保AI角色能夠根據(jù)自己的命令有效地使用裝備和能力,而不管這些裝備和能力是什么。
? 盡管模塊化設(shè)計(jì)的初衷是為了玩家控制的隊(duì)友,但該設(shè)計(jì)也可以應(yīng)用到敵人AI角色上。在我們的敵人AI開發(fā)中,發(fā)現(xiàn)針對(duì)特定AI角色開發(fā)的能力和行為可以很輕松的遷移到其他角色上,只要相關(guān)資產(chǎn)(如動(dòng)畫和視覺特效)也適用于新角色。
? 為了支持BDS的模塊化設(shè)計(jì),需要特別射線評(píng)估樹和執(zhí)行樹的數(shù)據(jù)結(jié)構(gòu),以便它們可以跨多個(gè)行為片段復(fù)用。在開發(fā)DA時(shí),我們發(fā)現(xiàn)大多數(shù)行為片段可以復(fù)用相同的行為樹資產(chǎn),只有小部分復(fù)雜的行為需要特定的評(píng)估樹或執(zhí)行邏輯。通過將經(jīng)常復(fù)用的子樹分離成獨(dú)立的行為樹資產(chǎn),供其他樹引用,可以進(jìn)一步解耦,提高復(fù)用,降低持續(xù)維護(hù)成本。
31.8 Conclusion
? 本章介紹了一種決策行為系統(tǒng)(BDS):一個(gè)簡(jiǎn)單高效的支持復(fù)雜AI行為決策的框架。該系統(tǒng)核心是是“行為片段”—— 一種數(shù)據(jù)結(jié)構(gòu),封裝了評(píng)估和執(zhí)行離散操作所需的信息。片段使用行為樹進(jìn)行評(píng)估和執(zhí)行,“評(píng)估樹”是經(jīng)過修改的行為樹,它返回一個(gè)實(shí)用程序得分和一個(gè)目標(biāo),而執(zhí)行樹包含執(zhí)行操作的必要指令。
? 在運(yùn)行時(shí),行為片段可以通過BDS注冊(cè)到AI角色,每個(gè)注冊(cè)的片段代表角色可以執(zhí)行的單個(gè)動(dòng)作。通過將這些代碼片段作為角色更新循環(huán)的一部分進(jìn)行評(píng)估,并定期執(zhí)行產(chǎn)生最大效用值的片段,BDS會(huì)產(chǎn)生定向的、有目的的和反應(yīng)性的行為模式。