Paragon Bots:一麻袋騙人的伎倆
Mieszko Zielin’ ski
32.1 Introduction
? Paragon 是 Epic Games 用虛幻4引擎研發(fā)的一款MOBA類游戲,在項目開發(fā)后期決定在游戲里加入機器人玩家,有限的時間和人力資源,以及圍繞玩家而構(gòu)建的游戲機制,意味著項目組沒有多少富余的時間去完成這個任務(wù)。本章將介紹我們?yōu)閁E4的AI系統(tǒng)做的一些擴展,以及為Paragon機器人做的一些簡單系統(tǒng)實例。最后,我們對基礎(chǔ)行為樹做了一些增強,提出了一些適用于MOBA游戲的空間表征,將所有這些與我們成熟的空間決策系統(tǒng)、環(huán)境查詢系統(tǒng)(EQS)集成,并添加了一些其他技巧。結(jié)果超出了我們的預(yù)期!
32.2 Terms Primer
??本章中有許多術(shù)語讀者可能不知道,所以我們將在這里解釋它們。玩家在Paragon中控制英雄單位,英雄單位即可以施放技能對敵人造成傷害或削弱(debuff),強化(buff)或治療自己和隊友的角色。Buff(強化)意味著提高能力(如回復(fù),移動或攻擊速度等),而削弱則有相反的效果。技能(Abilitiy)會消耗英雄的能量,這是一種有限的資源。從某種意義上說,技能也會消耗時間,因為它們受到冷卻時間(CD)的限制。有些能力總是活躍的(active),而另一些則需要明確的激活。游戲的目標是摧毀敵人的基地,同時保護自己的團隊的基地?;氐姆烙菆F隊可以用來阻止或減緩敵人前進的速度。塔和塔之間有一條甬道,連接到敵人的基地,小兵從一個基地出發(fā)通過甬道移動到另一個基地。小兵是一種簡單的生物,他們會為自己的團隊而戰(zhàn)斗,并且每隔一段時間出現(xiàn)一波(wave,即幾隊小兵同時出現(xiàn))。
??這款游戲的意義遠不止于此。在小路之間有一個叢林,里面住著叢林怪物(英雄為了獲得經(jīng)驗和臨時增益(buff)而殺死的中立生物),在那里可以找到經(jīng)驗井。游戲中的英雄和技能可以升級,獲得被動或主動能力等。然而,本章只關(guān)注
游戲中有英雄和能力升級,以及提供被動和主動能力的紙牌等等。然而,本章將只關(guān)注bot是如何圍繞前一段所述的游戲元素進行思考的。
32.3 Extremely Parameterized Behavior Trees
? 經(jīng)驗豐富的AI開發(fā)者可能會驚訝于所有Paragon機器人都使用相同的行為樹。由于時間和資源的限制,我們無法為每個英雄,甚至是每種英雄類型開發(fā)單獨的樹。由此誕生了一個特定的解決方案:主行為樹定義了通用結(jié)構(gòu)和規(guī)范準則,但行為執(zhí)行的細節(jié)(比如使用哪種能力,執(zhí)行哪種空間查詢等等)是參數(shù)化的,因此一些具體的實時數(shù)值只有在需要的時候才會從AI身上獲取。
32.3.1 Vanilla UE4 Behavior Trees
? 在詳細介紹UE4的行為樹系統(tǒng)細節(jié)以及該系統(tǒng)在Paragon的擴展之前,先來個總覽。UE4的行為樹系統(tǒng)已經(jīng)做為工具包被使用多年了,所以介紹將會被限制在新增功能實現(xiàn)上。
? UE4的行為樹系統(tǒng)是基于事件驅(qū)動方式實現(xiàn)的。一旦選擇了表示任務(wù)的葉節(jié)點,在任務(wù)完成或條件改變之前,樹不會重新評估。執(zhí)行條件以裝飾器節(jié)點的形式實現(xiàn)(Champandard 2007)。當(dāng)它的條件改變時,裝飾器節(jié)點可能會中止較低優(yōu)先級的行為或它自己的子樹,這取決于設(shè)置。
? 行為樹與黑板系統(tǒng)(Blackboard)緊密相連,黑板系統(tǒng)是默認的通用信息存儲結(jié)構(gòu),采用簡單鍵值對存儲的形式。它非常靈活(它幾乎可以存儲任何類型的信息),并且有很多方便的內(nèi)置特性,可以在運行時讀寫數(shù)據(jù)(動態(tài)性)。黑板系統(tǒng)的鍵值對是參數(shù)化行為樹節(jié)點的最簡單方法,節(jié)點需要的數(shù)據(jù)value可以簡單的通過key來獲取。參數(shù)化行為樹節(jié)點的一個例子是MoveTo節(jié)點,它從黑板系統(tǒng)中獲取移動目標位置。
??我們的BT實現(xiàn)還有一個輔助節(jié)點類型—服務(wù)節(jié)點(service node)。它是一種附加到常規(guī)節(jié)點(組合節(jié)點或葉子節(jié)點)的節(jié)點類型,只要它的父節(jié)點是活躍分支的一部分,它就是“活躍的”。當(dāng)激活或禁用的時候,服務(wù)節(jié)點會得到通知,并且可以選擇多少幀活動一次。
32.3.2 Environment Querying System
??UE4的AI系統(tǒng)的另一個單元,就是EQS系統(tǒng),中文名字叫環(huán)境查詢,顧名思義其實就是對當(dāng)前的場景里滿足條件的一些信息進行查詢,并且返回結(jié)果,讓我們AI根據(jù)收集的這些信息做出不同響應(yīng)。主要用于AI定位和目標選擇等任務(wù)。通常BT系統(tǒng)提供了一個任務(wù)節(jié)點和一個服務(wù)節(jié)點,用于運行EQS查詢并將結(jié)果存儲在黑板中。
??對于Paragon,我們對EQS進行了更改,這樣就可以通過在黑板上指定一個鍵來指向我們想要使用的查詢模板。查詢模板本身是常規(guī)的UE4 UObjects,所以不需要在黑板上做任何工作。唯一需要做的事情是擴展BT任務(wù),發(fā)出環(huán)境查詢,以便能夠使用由黑板值指示的查詢模板。然后我們使用這個新功能為近戰(zhàn)和遠程英雄執(zhí)行不同的定位查詢;近戰(zhàn)英雄盡可能靠近敵人以發(fā)動攻擊,遠程英雄則將距離維持在攻擊范圍內(nèi),這樣就不會離敵人太近。
32.3.3 Blackboard Extension
? 黑板系統(tǒng)存儲新類型只需要一個新的鍵值類型就可以。對于Paragon,我們增加了一個能力標識key,唯一標識給定英雄可以執(zhí)行的能力。通過新的黑板 key type,我們可以方便的配置BT節(jié)點,并根據(jù)不同目的選擇不同的能力。第32.4節(jié)描述了選擇能力的方式。
32.3.4 Behavior Moods
? 通常認為行為樹是信息的最終消費者,其根據(jù)數(shù)據(jù)和信息來做最優(yōu)決策。除此之外,我們也需要能獲取正在發(fā)生的行為的信息的子系統(tǒng)。子系統(tǒng)并不需要具體直到AI在做什么,只需要知道其當(dāng)前的“情緒”(mood),如是否在逃跑、是否在攻擊角色或塔等。當(dāng)前的mood是通過專有服務(wù)節(jié)點設(shè)置的。“情緒”信息隨后會被用在一些派生功能中,如設(shè)置AI的關(guān)注點、哪些移動相關(guān)的能力可以使用等。

圖32.1顯示了所描述的擴展和特性如何混合在一起的示例。
32.4 Ability Picker and Bot Ability Usage Markup
??在給定的上下文信息中去決定使用那種能力不是一個簡單的任務(wù)。這個決定取決于多種因素,比如目標類型,我們想對它做什么,我們現(xiàn)在有多少能量,以及哪些技能正在冷卻。此外,許多能力具有多種不同的效果。例如,有些技能可以傷害或拖慢敵人,但它們也可以治療友軍英雄。
? Paragon中的能力是通過藍圖的腳本語言實現(xiàn)的,這給了設(shè)計師很大的自由度去設(shè)計能力的功能執(zhí)行。此外,僅通過原始信息是不足以弄清一個能力的的使用方法的。為了解決這個問題,我們想出了一系列標簽,設(shè)計師用來標記AI應(yīng)該使用的每一種能力。我們稱之為機器人能力使用標簽;例子如表32.1所示。

32.4.1 Ability Cached Data
? 當(dāng)機器人英雄被賦予一項能力時,我們從對應(yīng)藍圖中獲取相關(guān)數(shù)據(jù)。我們將結(jié)果存儲在機器人的能力緩存數(shù)據(jù)(Ability Cached Data)中,非常小心地確保數(shù)據(jù)表示是有效的。標簽在數(shù)據(jù)中被表示為一組標記。存儲的其他信息包括能力的范圍、類型、傷害、能量使用、冷卻時間等等。它還會緩存時間戳,顯示指定技能的冷卻時間何時結(jié)束,以及AI何時有足夠能量施放指定技能。機器人控制的英雄的每一個可用的激活技能都在能力緩存中有對應(yīng)的表示。能力緩存數(shù)據(jù)是能力選擇器效率的關(guān)鍵。
32.4.2 Ability Picker
? 能力選擇器是一個簡單但功能強大的工具,能從一組給定能力中選擇正確的能力。
能力選擇器執(zhí)行此操作的方式非常簡單——實際上,奧秘就在能力緩存數(shù)據(jù)中。
能力選擇器所做的就是遍歷在給定時間點可用的能力列表,并檢查它是否與所需的效果和目標類型相匹配。返回的能力是所需成本最小的之一。根據(jù)目標類型,“最佳成本”可以有不同的含義。 當(dāng)瞄準小兵時,我們更喜歡消耗小的技能,而我們留下費用更高的技能來瞄準英雄。 不用說,這種評分方法還有很大的改進空間。核心能力選擇器算法非常簡單,在代碼清單 32.1 中以偽代碼形式呈現(xiàn)。

? AllAbility 是一個數(shù)組,其中包含機器人可用的每個能力的能力緩存數(shù)據(jù)。IfValidTarget 函數(shù)檢查給定的目標是否屬于合適的類型(英雄、小兵、塔),是否屬于有效團隊,以及目標的空間密度是否足夠高。IsBetterScore給小兵更低的分數(shù),給英雄更高的分數(shù),因此會更傾向于同英雄戰(zhàn)斗。
32.4.3 Target’s Spatial Density
? 一些技能被設(shè)計師設(shè)計為可以對小兵單位釋放,但只有當(dāng)該區(qū)域有一個以上的小兵單位時才可以使用它們。這種是范圍技能(AoE),它影響指定區(qū)域內(nèi)的多個小兵,而不是單個小兵。在一個小兵身上使用這種技能純粹是浪費精力和時間。
? 為了能夠有效地測試給定的小兵是否“單獨”,我們找到傳遞給能力選擇器的每個小兵的空間密度。小兵密度作為影響貼圖計算的一部分進行計算,這將在本章后面介紹,因此在運行時獲取此信息只需執(zhí)行簡單的查找操作。
32.4.4 Debugging
??有一個系統(tǒng)來控制所有的技能選擇有一個更容易調(diào)試的額外好處。添加可選的、詳細的日志記錄非常容易,一旦啟用,它將描述在選擇過程中哪些功能被丟棄,以及為什么被丟棄。記錄的信息與空間和時間上下文相結(jié)合,我們可以通過UE4的可視日志即時獲得這些信息,從而快速解決許多技能選擇問題,這些問題通常被證明是技能標記中的錯誤。你永遠不能相信那些該死的人類!
? 在機器人的技能執(zhí)行測試中,一個非常有用的技巧是添加一個控制臺命令,用于在游戲運行時覆蓋技能選擇,以始終選擇指定的能力。由于采用了集中式方法,我們能夠通過將一段調(diào)試邏輯插入到Ability Picker的FindAbilityForTarget函數(shù)中來實現(xiàn)它,該函數(shù)將始終拾取指定的技能。
32.5 One-Step Influence Map
??the?influence map 是游戲AI中眾所周知的概念,它已經(jīng)存在很多年了(Tozour 2001)。這是一個非常簡單的概念,易于掌握,設(shè)置簡單,但從提供的非常簡單的信息中產(chǎn)生大量有用的數(shù)據(jù)。這個想法是基于這樣一個概念,即隊伍對其環(huán)境施加“空間影響”,與他們的戰(zhàn)力、生命、戰(zhàn)斗狀態(tài)或任何其他隨距離衰減的因素成比例。the?influence map是所有這些影響的疊加,可用于指導(dǎo)人工智能決策。
? 通常,構(gòu)建the?influence map需要每個智能體通過兩個步驟。首先是在代理的當(dāng)前位置應(yīng)用代理的“影響”,這通常是智能體影響力最大的地方(也有其他可能性[Dill 2015])。第二步是影響傳播,我們獲取給定智能體的影響并將其傳播到所有相鄰區(qū)域,然后傳播到這些區(qū)域的相鄰區(qū)域,依此類推。智能體以這種方式分布的影響是距離源越遠,影響越弱的函數(shù)。
? 影響力傳播可能是一個非常昂貴的操作;取決于影響力映射表示和分辨率(盡管有算法提供無限分辨率影響映射[Lewis 2015])。當(dāng)考慮更多的影響來源時,開銷也會更加高昂。由于Paragon服務(wù)器的處理限制,未選擇原始的方法。
? 有很多種方法來實現(xiàn)the?influence map。性能對于Paragon機器人非常重要,所以我們選擇了一個非常簡單的結(jié)構(gòu)來表示圖上的影響力。由于在垂直軸上沒有與游戲性相關(guān)的可導(dǎo)航空間重疊,因此我們能夠用一個簡單的2D單元格網(wǎng)格表示地圖,每個單元格表示地圖的一個固定大小的正方形。使用的正方形大小是在獲取高分辨率數(shù)據(jù)和不占用太多內(nèi)存來存儲地圖或在計算更新影響力時使用太多CPU之間的折衷。
??我們不能簡單地忽略這樣一個事實,即不同的敵人具有不同的射程和力量屬性,這將通過影響傳播自然地影響the?influence map。代替實際的影響傳播,我們應(yīng)用一些智能體的影響來映射特定半徑內(nèi)的單元,而不僅僅是智能體當(dāng)前所在的一個單元。我們對每個目標(甚至是遠程目標)使用零半徑,對英雄我們使用每個給定英雄的主要能力范圍。有人可能會爭辯說,在半徑而不是點上應(yīng)用影響幾乎與影響傳播相同,但是當(dāng)將影響應(yīng)用到半徑內(nèi)的每個單元時,與將其傳播到連續(xù)的鄰居相比,性能會有很大的提高,特別是如果傳播關(guān)心單元到單元的連接。將影響應(yīng)用于半徑中的所有單元確實會產(chǎn)生忽略通常會阻止影響的障礙物的副作用,但由于Paragon匹配的動力學(xué)和Paragon貼圖的構(gòu)建方式,這種影響可以忽略不計。
??我們使用the?influence map的主要方法是確定機器人在戰(zhàn)斗中的位置。根據(jù)英雄類型和情況,我們可能希望機器人遠離敵人(遠程英雄的默認情況),或者相反,靠近敵人(近戰(zhàn)英雄的默認情況)。我們還可以使用“友好影響”來表示更安全的位置,或者相反,幫助機器人分散開來,避免成為容易的AoE攻擊目標。事實證明,所描述的用例實際上并不需要影響傳播,因為影響范圍(定義為英雄的有效范圍)已經(jīng)嵌入到the?influence map數(shù)據(jù)中。傳播的數(shù)據(jù)會讓我們了解戰(zhàn)術(shù)位置可能如何變化,但在Paragon中,它一直在變化,因此我們選擇了一種更便宜的解決方案,而不是只能產(chǎn)生細微更好的結(jié)果的解決方案。通過故意擴大每個英雄的半徑,也可以在一定程度上偽造 Influence propagation。擴展甚至可以從運行時信息中派生,比如當(dāng)前速度、健康狀況、能量等,因為我們定期從頭開始構(gòu)建the?influence map。如下文所述,the?influence map與EQ集成,以影響定位、目標選擇等空間過程
32.5.1 Other Influence Sources
??其他游戲玩家類型也可以改變the influence map。讓我們首先考慮塔樓(第32.2節(jié)中描述的防御結(jié)構(gòu))。所有進入敵方塔樓攻擊范圍的人物都處于極度危險中,因為塔樓會主動攻擊,甚至對高級英雄也是如此。然而,影響信息僅由英雄機器人使用,只要英雄有小兵陪伴,英雄在敵方塔樓范圍內(nèi)是安全的。小兵是塔樓的主要目標。出于這個原因,只有當(dāng)一座塔沒有小兵可以攻擊時,我們才會在地圖構(gòu)建中包含該塔的影響信息;否則,機器人不會關(guān)心塔樓的危險(或者事實上,甚至不知道它?。?。
??這里值得一提的是,由于塔樓是靜態(tài)結(jié)構(gòu),我們不需要重新計算每一幀都會影響哪些the influence map cekks。相反,我們在匹配開始時收集所有受影響的單元格,然后在重建the influence map時重用緩存的信息。
??在the influence map生成過程中,我們考慮的另一個影響源是AOE攻擊。其中一些攻擊持續(xù)時間足夠長,因此有必要將其納入影響計算。在the influence map中有這些信息,可以很容易地“看到”進入這樣一個區(qū)域的危險!我們不會用持續(xù)時間短的AoE攻擊來注釋影響地圖,因為AI不會有機會對它們做出反應(yīng),不管怎樣,這些攻擊持續(xù)的時間剛好足以造成傷害,而且一旦它們被施放,幾乎沒有機會避免它們。
32.5.2 Information Use
? 如前所述,the influence information的主要用途是給智能體定位。通過添加另一個擴展空間查詢系統(tǒng)(EQS)的測試類型,可以輕松地將此信息包含在其余的定位邏輯中。EQS可以用一個簡單的測試樣例讀取世界空間里指定位置的?the influence information,該信息可以用來計算和篩選智能體未來可能的運動位置。將這一簡單的測試合并到所有智能體的定位查詢中,可以讓我們快速獲得非常好的結(jié)果。由于這一變化,機器人獲得了避免進入敵人塔樓的火力或撞向敵人群的能力,并可以選擇靠近朋友的位置,等等。
??調(diào)用與地圖的每個單元格相關(guān)的輔助信息。嚴格來說,這些信息不是影響圖的一部分,而是作為影響圖構(gòu)建的一部分收集的。輔助信息包括影響每個單元的智能體列表。我們利用這一信息,通過有效地減少他們考慮定期視線測試的目標數(shù)量來改善角色的感知能力。查詢給定區(qū)域內(nèi)敵方目標或英雄的the influence map歸結(jié)為一個簡單的查找操作。
??影響數(shù)據(jù)的最后一點是我們稱之為目標密度(target density)的東西。這是一個針對給定類型敵人(小兵或英雄)的簡單單元格計數(shù)器,我們使用它來確定給定目標是否“單獨”或在攻擊特定目標時是否可能擊中其他目標。這是提示能力選擇器在給定目標上使用AoE能力是否浪費能量的信息。
? 出于時間成本的考慮,對重要的數(shù)據(jù)進行復(fù)用是必要的,盡可能的榨干數(shù)據(jù)的最后一絲有用信息。
32.6 Lane Space
??我們經(jīng)常要回答的一個問題是“機器人X在其所在的路線上上離Y有多遠”,其中Y可能是敵塔、英雄、小兵,或者只是世界上任意的位置。我們并不真正關(guān)心實際的3D距離,只關(guān)心“路線有多遠”。如果路線是直線,這是非常容易回答的,但在Paragon就不是這樣了……除非我們把它們弄直!

? 圖32.2a描繪了常規(guī)MOBA地圖,其中a和B標記了兩隊基地的位置。共有三條路線,左右路線完全不直。這就是路線空間概念的由來。將三維世界位置轉(zhuǎn)換為路線空間需要將其投影到AB段定義的直線上。有關(guān)此轉(zhuǎn)換的說明,請參見圖32.2b。
??引入路線空間可以很容易地添加一種新型的EQS測試,用于根據(jù)給定路線上與作戰(zhàn)線的相對距離進行評分或過濾。例如,我們用它來讓遠程機器人選擇在小兵身后10米的位置。
32.6.1 Lane Progress
? 路線空間的自然延伸是Lane Progress。它是一個定義為位置到a或B的路線空間距離的度量,是|AB|標準化(從a到B的距離)。
Lane Progress是相對于給定團隊的基地計算的,因此,對于團隊a,基地a位置的Lane Progress值為0,基地B位置的Lane Progress值為1。對于B隊來說,情況正好相反;事實上,對于每個團隊A的Lane Progress值x,團隊B的值將等于(1–x)。
32.6.2 Front-Line Manager
??在MOBA中,英雄們必須了解基于危險和安全區(qū)域的路線定位。在戰(zhàn)斗中,遠程英雄更喜歡呆在小兵線后面一點,而近戰(zhàn)英雄應(yīng)該在前線戰(zhàn)斗。
? 為了讓機器人像真人一樣工作,我們創(chuàng)建了前線管理器(Front-Line Manager)。它的唯一目的是跟蹤所有活著的小兵,以及所有剩余的塔樓,并計算出戰(zhàn)斗地點。在the influence map構(gòu)建期間,the influence map管理器正在向Front-Line Manager提供有關(guān)小兵的信息。根據(jù)這些信息和給定團隊每條路線上塔樓的當(dāng)前狀態(tài),F(xiàn)ront-Line Manager正在計算兩個團隊每條路線上的前線。準確的前線值以Lane Progress表示。
??類似地,對于the influence map信息,我們通過實施另一個測量位置到前線距離的EQS測試,將前線信息納入定位邏輯。
??另一個前線信息相關(guān)的地方是在選擇敵人的過程中。我們希望避免機器人追擊敵方英雄深入敵方領(lǐng)土,因此到前線的距離有助于目標得分。同樣,這是通過專用的EQS測試完成的。
32.7 Other Tricks
??由于時間限制,偷工減料是至關(guān)重要的,所以我們還使用了很多其他的小技巧。這些通常是簡單的臨時解決方案,要么工作得足夠好,以至于玩家不會注意到,要么是給未來新的解決方案占個位置。
? 第一個值得一提的是完美的目標。遠程英雄機器人精確瞄準目標位置。嚴格來說,這不是作弊,因為有經(jīng)驗的玩家做同樣的事情不會有問題。而且它甚至不像聽起來那么致命,因為大多數(shù)遠程技能都使用物理投射物(不是瞬間命中),其中一些具有彈道特性(受重力影響)。增加輕微的瞄準角度偏差不是問題;Paragon的簡易難度機器人實際上做到了這一點,只是“完美目標”有助于修正一個機器人,以彌補與人類玩家的技能差距。此外,人類的大腦硬件支持的東西太多了(特別是視覺處理),為什么機器人要放棄一件與生俱來的東西呢!
??我們使用的另一個簡單的技巧是解決一個來自混合人類機器人團隊的玩家的投訴。問題是,游戲一開始,所有的機器人就開始在車道上奔跑。有人建議機器人應(yīng)該等一會,等小兵出現(xiàn)。由于這是一次性行為,將其視為常規(guī)人工智能推理的一部分將是對性能的浪費。我們提出了一個非常簡單的想法(并實施了),即比賽開始時觸發(fā)的一次性行為。它使機器人等待小兵出現(xiàn),然后沿著路線行走,直到他們看到敵人,或到達地圖的中間,此時機器人切換到默認行為。沿著路線行走需要使用Paragon的自定義導(dǎo)航流場,這使得移動完全無需尋路,因此比常規(guī)AI導(dǎo)航便宜得多。一旦我們有了腳本化的行為支持,它在測試中也很有用。
32.8 Conclusion
? 我覺得在游戲AI上工作是一門藝術(shù),它利用現(xiàn)有的東西,為通常不那么簡單的問題提出簡單的解決方案。在本章中,我們展示了如何將這種方法應(yīng)用于Paragon機器人上的工作。在時間緊迫的情況下工作時,重用和擴展AI系統(tǒng)尤其重要,因此提前投入精力使這些系統(tǒng)具有靈活性將在未來獲得回報。否則,對Paragon中的所有機器人使用單一行為樹是不可能的。當(dāng)涉及到解決特定于游戲的問題時,通常最好提出一個簡單的解決方案,通過提供一些易于理解的抽象,將問題隔離開來,并將復(fù)雜性隱藏在AI代碼的其余部分中。The Ability Picker and Front-Line Manager 就是很好的例子?!氨3趾唵巍钡脑瓌t永遠值得遵循!
文章來源:http://www.gameaipro.com/??
如侵犯版權(quán),請聯(lián)系譯者刪除。??
讀者若需要轉(zhuǎn)載,請注明出處。? ?
若有錯誤,歡迎指正。