MOBA英雄AI設計分享

轉自:http://www.gamelook.com.cn/2018/07/333877安全

文/wataloo框架

1  設計概要工具

1.1  設計原則和目的學習

英雄AI的目的主要有:優化

1.新手過渡局,讓玩家剛進入到遊戲時,和較弱電腦對戰,培養成就感,避免還沒有熟悉遊戲致使的挫折流失。插件

2.人機對戰,給玩家練習新英雄或者挑戰高難度電腦的機會。設計

3.溫暖局,對連敗玩家,匹配機器人去補償一場勝利,舒緩連敗挫折。3d

4.掉線託管,用強度合理的AI來補位掉線玩家,減小其餘在線玩家的掉線局有損體驗。blog

英雄AI的設計原則是:優秀的AI並不要求是儘可能的和人表現一致,也不是多麼的精準和無懈可擊,而是可以和玩家進行很好的交互,提高遊戲體驗。遊戲

1.2  設計思路

咱們的AI實現分爲四個階段,正好相似於玩家的成長。

第一階段是基本戰術AI,主要包括:混線,買裝備,逃避危險,回城,補兵。是一種單兵做戰AI。模仿新手玩家的剛剛開始學習操做。

第二階段是增長一些事件響應用來控制英雄的走位和換線,包括敵塔下撤退,救援己方塔,包括抱團。模仿玩家已經開始漸漸瞭解塔的屬性,初步開始與其餘玩家合做。

第三階段是協同戰術AI,該AI週期性的判斷是否應該果斷出擊打出一波局部進攻。它會在比較短的時間內控制局部範圍內的單位一塊兒行動,會有走位,配合使用技能等較細緻的行爲,是一種小團隊AI。模仿玩家已經開始熟悉全部英雄,微操提高,對Gank略有心得。

第四階段是戰略AI,總體協調所有玩家在地圖上的分佈,野區,兵線。模仿玩家已經有較強的團隊意識,會分工和配合了。

2  名詞解釋

1.單體戰術AI:每一個英雄都會配備本身獨特的戰術AI,此AI將實現戰鬥細節,好比英雄什麼時候該釋放技能,對誰釋放;如何走位規避風險或者造成Gank優點站位;怎麼補兵;購買販賣何種道具;什麼時候追擊什麼時候逃跑等等。

2.全局AI:全局AI是一種綜合考慮場上全部戰鬥因素以後對單體發佈指令的控制器。全局AI所關注的事情主要有:兵線英雄的分佈,Gank發動時機,逃避危險,救援建築。全局AI是經過給單位添加指令buff和修改單體戰術AI的參數來實現的。

3. AI參數:咱們將盡量的暴露出AI的各類行爲參數,並經過AI參數來控制電腦的AI難度強度。高難度AI,意味着它優先使用較高收益的戰略。而低難度AI則能夠選擇比較低收益的戰略。咱們的不一樣難度AI是經過修改AI的一系列參數來實現的。

4. 行爲樹:樹形結構的行爲流程處理,每一個Tick到來時,行爲樹按照必定的規則進行搜索和執行相應節點,直到到達某個返回true的葉節點,以後結束當前Tick。

5. Gank 小組:Gank小組是一個動態的局部的概念,當我方英雄A周邊有敵對英雄時,英雄A就是屬於某個Gank小組的,Gank小組的其餘成員必須和A距離很近。

6.  Gank 行爲:Gank行爲是一種對集體行爲的模仿,其本質仍然是單體AI,但Gank發動時機是經過全局AI來控制的。處於Gank狀態的機器人會表現出與單體行動很不同的行爲,好比坦克可能寧死也不撤退,ADC優先釋放控制技能。

3  行爲樹實現

3.1行爲樹腦圖

行爲樹腦圖是一個多叉樹,各個父節點的全部子節點節點按照從左到右、從上到下的順序逐個檢測,只要返回True了,之下的節點都再也不執行。灰色註釋爲節點執行的先決條件,灰色節點不知足則直接返回False。腦圖中的

對應着行爲樹中的Selector節點。

行爲樹工具基本思想都一致,但使用起來仍是有較大差異的。常見的是Unity3D的BehaviorDesigner插件,虛幻四自帶的行爲樹組件,公司內部的Behaviac。我最喜歡的是BehaviorDesigner,學習時仍是推薦Behaviac,傳送門:http://www.behaviac.com/language/zh/%E9%A6%96%E9%A1%B5/

緣由比較簡單,只有它是中文。

英雄AI行爲樹腦圖

這是一個還沒有展開的行爲樹,每一個超連接都對應一個子樹,會逐個展開來說解。

3.1.1購買道具

購買道具

英雄購買道具須要提早寫好英雄對應的階段道具設置。

好比:

出裝流程

每隔一段時間檢測一次金錢是否能夠買賣下階段的道具。

3.1.2瀕死逃亡

瀕死逃亡

3.1.3 Gank戰術行爲

Gank戰術行爲

每一個英雄都須要單獨編寫此子樹。首先搜尋最優攻擊目標,然後檢測是否能用技能組合一次秒之。

最優技能釋放目標搜索

知足如下條件的單位應該優先被鎖定:

1.HP較低

2.AP或者MP較高

3.物理或魔法護甲較低

4.處在友方其餘英雄攻擊範圍內

咱們可使用以下計算公式(本文裏面的任何公式都不必定是最優解的,但都知足定性的設計要求):

最優技能釋放目標搜索

其中a,b爲參數,AllyNearBy爲敵方英雄600碼內我方英雄數量,每增長一個盟友,敵人的誘惑程度增長b。推薦參數值a=0.7, b=0.3

技能是否使用只對最優釋放目標進行考慮。

3.1.4推兵線

推兵線

英雄磨血節點須要考慮收益,計算公式:

收益值要考慮率較多因素,包括敵我雙方血量,敵方英雄的同盟單位,收益值可能爲負值。

3.1.5執行AI行動指令 

AI行動指令通常都是經過行爲樹以外的全局AI腳原本產生,並通知給AI行爲樹。常見的使用方式是,用一個全局AI腳原本產生各類指令,將指令傳遞給行爲樹,實現全局AI控制單位。

3.2 AI事件響應

3.2.1英雄躲避塔的攻擊

避免英雄衝塔行爲。

3.2.2全局GankAI

週期計算Gank形勢。通知AI是否該Gank或者集體逃亡。

3.2.3救援塔

當塔受到攻擊時觸發,用來產生AI指令,控制AI行爲。

3.2.4兵線分佈調整

當遊戲運行時間超過6分鐘時,AI要開始抱團,強推一路,以後每三分鐘都要進行一次抱團檢測。

兵線危機值計算:

兵線局勢須要考察的因素:英雄數量,士兵數量,塔的數量,前塔的HP,推薦公式:

其中a,b,c爲參數,Lane表示兵線1,2,3。對應10v10遊戲推薦參數設置:a=8, b=2, c=6, d=0.2,e=20

兵線危機值能夠是負值,危機值越高則兵線越危險,值越低則兵線越安全。咱們每10秒計算一次兵線危機值,根據兵線的情況來決定是否援助和抱團。

抱團是一個較爲穩定的行爲,咱們設定每次防守抱團以後都要鎖定切換兵線行爲3分鐘,進攻抱團鎖定2分鐘。

從另外兩條兵線抽調英雄到最危險兵線。派遣數量服從規律:抽調後兵線上 我方英雄數目/敵方英雄數目>0.65(參數),儘量多抽調英雄,但也確保不會讓被抽調的兵線變得很不安全。派遣數目能夠是0,表示全線吃緊,每條兵線都沒法抽調英雄去支援其餘兵線。初期,每條兵線最少也要保留一個英雄。

3.3 Gank詳解

3.2.1 Gank行爲基本設定

首先要明確幾個設計前提:

1.Gank行爲優先級要高於單體行爲優先級,或者說,Gank行爲執行期間會屏蔽掉大多數單體AI行爲。

2.Gank行爲須要考慮到局部範圍內(好比說整個屏幕)全部單位(包括敵方),然後控制全部我方英雄一塊兒行動。

3.Gank AI控制下的機器人可能會表現出和單體AI徹底不一致的行爲,好比肉可能直接衝到敵人人堆中,吸取仇恨,至死方休;ADC和APC最優先的策略可能不是輸出,而是控制;部分機器人輸出傷害優先級要高於逃避危險。

4.Gank行爲並不是常態。達成必定條件以後纔會觸發。好比某個時刻敵我力量對比呈現一邊倒

Gank小隊的生成

Gank是局部小團隊行爲。必須考察周邊敵我英雄和塔的個數,英雄和塔的潛在殺傷。Gank是個局部行爲,只有距離很近的那些單位纔會被認爲是處於同一個Gank小組內。Gank小組是個動態變化的單位組。須要每隔一段時間從新生成一次。

生成方案:

尋找Gank中心英雄,Gank中心英雄只是根據位置搜索產生的,並不意味着它們會在Gank中處於核心地位。每隔一個週期(2秒,參數)先遍歷某陣營場上所有英雄,統計這些英雄身邊敵對英雄的數目。並按照遞減順序排列。身邊敵對英雄越多,該英雄越可能處於Gank中心位置。按順序遍歷己方英雄(只遍歷身邊有敵對英雄的),若是它們還未參與Gank,則以該英雄爲中心,在必定半徑(2000,參數)內搜索敵我未參與Gank的英雄,將盟友英雄寫入Gank小隊,並標記它們已經參與Gank了,將敵方英雄寫入Gank目標小隊(目標小隊並非敵方的實際Gank小隊,敵方的實際Gank小隊生成方式和我方一致)。如此,全部可能正處於交戰狀態的英雄就按照區域劃分到了不一樣的Gank小組。

Gank的發起和結束

Gank小隊是動態生成的,每一時刻Gank小隊都是存在的,但發起Gank行爲是須要條件的。

每隔一段時間要檢測一下Gank小隊的實力對比.

1. 若是我放Gank小隊實力明顯強於目標敵方小隊,則發動Gank,並鎖定5(參數)秒。Gank期間英雄優先執行Gank AI,屏蔽掉單體行爲。Gank結束鎖定後。從新生成Gank小組,從新判斷形勢,決定是否發起新的Gank。

2. 當我方Gank小隊實力明顯弱於敵方時,集體執行撤退到己方前沿塔。但並不進入Gank行爲。

3. 均衡局面,若是有敵方單位可秒(可秒的含義是,gank小組的輸出指望是目標單位hp的1.6(參數)倍),則馬上發動Gank。不然調整我方站位,綜合防護最強的英雄位置保持不變,脆皮遠離敵小隊中心,但不能離開坦克超過(1000參數)。調整站位是單體AI行爲,戰略AI經過參數來控制單體行爲(發送指令buff,發送目標位置)。

3.2.1技能傷害量化

若是但願AI精準的釋放技能,量化技能傷害是相當重要的。並非全部技能都是直接當即傷害的,AI要怎麼理解本身的被動技能和buff技能?

咱們作的處理是:

l 默認在一次Gank週期中AI能夠普通攻擊三次,或者5秒。

l 將被動技能,好比暴擊和加速之類的,直接量化爲三次攻擊或5秒攻擊中的傷害收益。

l 暈眩技能根據暈眩時間量化成額外傷害百分比。

l 輔助技能僅僅起增強隊友做用的,傷害量化爲0

當技能所有量化成具體數字以後,就能計算每一個英雄在單次Gank中的傷害輸出指望值了。

英雄威脅值

咱們用英雄威脅值來表徵英雄在單次Gank中的傷害輸出指望值。

威脅值的計算:

首先遍歷場上全部英雄,根據英雄技能等級和CD狀態預估出來技能的三種傷害(物理,魔法,真實)數據。

對峙雙方若是威脅值總和差異很大(參數60%),則認爲非均衡局面出現。優點一方會馬上發起Gank,進入團戰模式。而劣勢一方會馬上進入集體撤退狀態。

威脅值相差不是很大時,英雄表現爲單兵行動。此時威脅值的主要做用是敵對目標選擇。

3.2.1 GankTarget選擇

GankTarget的選擇方式——尋找最具吸引力的敵方單位,改進版的吸引力公式:

這個公式綜合考慮的因素有:敵人是否高AD或者高AP?物理護甲和魔法護甲如何?當前血量?我方集火的狀況下,傷害總輸出能殺死他幾回?

最大吸引值得敵方英雄會成爲Gank小組的共同目標

4 總結

在本文中,咱們按照從零開始逐步展開,完整描述了MOBA英雄AI的設計流程。限於篇幅,咱們僅僅描述了最核心的框架,諸多細節都未展開。在手遊 MOBA《全民超神》項目中,按照這個框架,咱們在短短一個月時間內就實現了英雄AI。

本方案原創了兩個核心設定:Gank和技能傷害量化。

Gank的設定讓AI可以有效的躲避危險,也能很精準的捕捉戰機,完成不少讓人讚歎的絕妙擊殺。

傷害量化,讓AI理解本身技能的特性。對AI行爲收益優化幫助很大。

相關文章
相關標籤/搜索