轉自: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行爲收益優化幫助很大。