簡介

最近一階段重溫了一些關(guān)于游戲人工智能方面的書籍。 加強(qiáng)了對(duì)influence map的認(rèn)知。想要親自動(dòng)手實(shí)現(xiàn)一下。

正如文章標(biāo)題所示,這篇文章講的是:如何將influence map的機(jī)制融入到當(dāng)前較火的unity尋路插件A* pathfinding project里。

先科普一下Influence Map基本概念:

influence map中文名:勢(shì)力圖或影響圖。以下稱勢(shì)力圖。 勢(shì)力圖是基于空間的,某些空間歸屬A,另外一些空間歸屬B,等等。

把問題規(guī)??s小到一場(chǎng)游戲戰(zhàn)役,每個(gè)兵種單位都占據(jù)并影響著一定的空間,且相同勢(shì)力的單位對(duì)同一空間的影響可以疊加,影響值隨傳播距離遞減。

勢(shì)力圖除了告訴我們某塊空間的歸屬之外,還能告訴我們什么呢?

1,進(jìn)攻方,可以根據(jù)勢(shì)力圖選擇率先攻擊敵人薄弱的地方.防御方,可以根據(jù)勢(shì)力圖選擇一個(gè)較為安全的撤退地點(diǎn)。

2,進(jìn)一步,統(tǒng)計(jì)分析,比如采取某種戰(zhàn)略之后,觀察勢(shì)力圖變化,可以分析之前戰(zhàn)略效果。

3,更進(jìn)一步,通過對(duì)一段時(shí)間的勢(shì)力圖進(jìn)行對(duì)比,可以大致預(yù)測(cè)敵軍的部署動(dòng)向。

 

實(shí)現(xiàn)InfluenceMap的要點(diǎn)

1,定義各單位的勢(shì)力值傳播范圍,形狀,特性(這是Gameplay)由于每個(gè)兵種的特性和能力值不同,故每個(gè)兵種單位的影響半徑與程度不盡相同。

比如:一個(gè)坦克可以影響3km之內(nèi)空間,3km之內(nèi)都保持較高的影響。而一個(gè)機(jī)槍兵只能影響1km以內(nèi)的空間,并且超出500m之后,士兵的影響十分微弱。

坦克相比機(jī)槍兵更具影響力,所以想要抵消掉坦克的影響,我們可能需要更多的機(jī)槍兵與之對(duì)抗。這些數(shù)值根據(jù)具體的游戲邏輯來設(shè)定。

 

2,實(shí)現(xiàn)傳播算法,以什么樣的方式傳播,各勢(shì)力影響值得疊加邏輯。

3,實(shí)現(xiàn)衰減算法,以什么樣的方式衰減,常見如影響隨距離線性衰減。

 

本文使用的算法

1,確定傳播區(qū)域,獲取傳播區(qū)域內(nèi)node,從center node開始以廣度優(yōu)先遍歷區(qū)域內(nèi)node,更新influence值。

2,influence值隨傳播距離線性衰減。

這是最簡單的方法,還有一些提高性能的方法,有興趣同學(xué)可以google之。

 

尋路與InfluenceMap結(jié)合

通過以上的總結(jié),我們已經(jīng)知道了勢(shì)力圖對(duì)于戰(zhàn)略的作用。那么對(duì)于一般的游戲,我們是否用的上呢?

我現(xiàn)在的想法是,Influence map可以和尋路系統(tǒng)進(jìn)行融合。比如,NPC在尋路的時(shí)候,不是選擇一條最短的路徑,而是選擇一條最安全的路徑。

只需想象一下即可,我們需要到達(dá)A點(diǎn),但最短路徑上有一個(gè)敵方炮塔,我們無法對(duì)抗炮塔的攻擊,那么我們需要舍近求遠(yuǎn),繞道一個(gè)炮塔無法攻擊的地點(diǎn),最終到達(dá)A點(diǎn)。

 

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 

截圖體現(xiàn)了我們之前總結(jié)出的規(guī)律:

1,影響的傳播,紅色區(qū)域乃是影響的傳播范圍。

2,影響的衰減,隨著遠(yuǎn)離中心區(qū)域,紅色逐漸變淺。

3,障礙物會(huì)阻礙影響的傳播。

4,尋路小機(jī)器人,尋路時(shí)試圖躲避高危的紅色區(qū)域。

 

最后的大體效果:

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

尋路機(jī)器人會(huì)躲避敵方靜止的機(jī)器人,并且雙方相互影響。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 

相關(guān)修改文件,有興趣朋友可以繼續(xù)研究

編輯器擴(kuò)展涉及到的文件如下:

Base.cs  AStarPath.cs  AStarPathEditor.cs  astarclassess.cs   核心代碼 Color NodeColor (GraphNode node, PathHandler data)

勢(shì)力圖的邏輯涉及到的文件如下:

astarclassess.cs          InfluenceUpdateObject這是一個(gè)新的類,表示那部分導(dǎo)航圖需要更新。 可參考GraphUpdateObject

GridNode.cs / GraphNode.cs   添加node的influence信息。

GridGenerator.cs                         添加node的influence信息更新邏輯。

Seeker.cs                                      添加使用AInfluencePath尋路的邏輯。

AInfluencePath.cs         AInfluencePath : ABPath這是一個(gè)新的類,用A*算法求取的influence路徑。

需要重定義public override uint GetTraversalCost (GraphNode node)

 

最近更新了一些細(xì)節(jié):

主要優(yōu)化了性能。因?yàn)锳* pathfinding project 使用多線程。所以,在更新graph的Influence信息時(shí),需要blockpathfinding thread.否則會(huì)出現(xiàn)尋路異常。

在更新完地圖后 unblock pathfinding thread,為了防止頻繁的block and unblock pathfinding thread,新建一個(gè)更新隊(duì)列,批處理多個(gè)agent的更新請(qǐng)求。

如果有需要更新的Influence請(qǐng)求,就會(huì)請(qǐng)求block pathfinding thread,但該函數(shù)不會(huì)一直等待而是立即返回,下一幀查看pathfinding thread是否block。

如果后面某一幀 pathfinding thread block 那么立即批處理更新隊(duì)列中的請(qǐng)求。 我們可以設(shè)置每幀更新請(qǐng)求數(shù)量的最大值,以免導(dǎo)致某幀會(huì)耗時(shí)過長。

沒有位置和信息變化的agent不需要請(qǐng)求刷新Influence信息,并且同一個(gè)agent新的Influence信息會(huì)覆蓋后面的信息。這樣可以保證queue不會(huì)過度膨脹。

http://www.cnblogs.com/tangzhenqiang/p/7093026.html