遊戲AI的生命力源自哪裡?為你揭開MOBA AI的祕密!

騰訊雲加社群發表於2018-06-22

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

本文由wataloo發表在專欄wataloo的試驗田

1 設計概要

1.1 設計原則和目的

英雄AI的目的主要有:

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

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

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

4.掉線託管,用強度合理的AI來補位掉線玩家,減少其他線上玩家的掉線局有損體驗。

英雄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。腦圖中的

img

對應著行為樹中的Selector節點。

行為樹工具基本思想都一致,但使用起來還是有較大差別的。常見的是Unity3D的BehaviorDesigner外掛,虛幻四自帶的行為樹元件,公司內部的Behaviac。我最喜歡的是BehaviorDesigner,學習時還是推薦Behaviac,傳送門:www.behaviac.com/language/zh…

原因比較簡單,只有它是中文。

img

這是一個尚未展開的行為樹,每個超連結都對應一個子樹,會逐個展開來講解。

3.1.1購買道具

img

英雄購買道具需要提前寫好英雄對應的階段道具設定。

比如:

img
出裝流程

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

3.1.2瀕死逃亡

img

3.1.3 Gank戰術行為

img

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

最優技能釋放目標搜尋

滿足以下條件的單位應該優先被鎖定:

1.HP較低

2.AP或者MP較高

3.物理或魔法護甲較低

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

我們可以使用如下計算公式(本文裡面的任何公式都不一定是最優解的,但都滿足定性的設計要求):

img

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

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

3.1.4推兵線

img

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

img

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

3.1.5執行AI行動指令

img

AI行動指令一般都是通過行為樹之外的全域性AI指令碼來產生,並通知給AI行為樹。常見的使用方式是,用一個全域性AI指令碼來產生各種指令,將指令傳遞給行為樹,實現全域性AI控制單位。

3.2 AI事件響應

3.2.1英雄躲避塔的攻擊

img

避免英雄衝塔行為。

3.2.2全域性GankAI

img

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

3.2.3救援塔

img

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

3.2.4兵線分佈調整

img

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

兵線危機值計算

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

img

其中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.3.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.3.2技能傷害量化

如果希望AI精準的釋放技能,量化技能傷害是至關重要的。並不是所有技能都是直接立即傷害的,AI要怎麼理解自己的被動技能和buff技能?

我們做的處理是:

  • 預設在一次Gank週期中AI可以普通攻擊三次,或者5秒。
  • 將被動技能,比如暴擊和加速之類的,直接量化為三次攻擊或5秒攻擊中的傷害收益。
  • 暈眩技能根據暈眩時間量化成額外傷害百分比。
  • 輔助技能僅僅起加強隊友作用的,傷害量化為0

當技能全部量化成具體數字之後,就能計算每個英雄在單次Gank中的傷害輸出期望值了。

英雄威脅值

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

威脅值的計算:

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

對峙雙方如果威脅值總和差別很大(引數60%),則認為非均衡局面出現。優勢一方會立刻發起Gank,進入團戰模式。而劣勢一方會立刻進入集體撤退狀態。

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

3.3.3 GankTarget選擇

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

img

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

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

4 總結

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

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

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

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


問答

我正在學習AI,我可以實施哪些遊戲來實踐它?

相關閱讀

類守望先鋒遊戲AI設計

用人工智慧打王者榮耀:匹茨堡大學&騰訊AI Lab為遊戲AI引入MCTS方法

當人工智慧遇到遊戲


此文已由作者授權騰訊雲+社群釋出,原文連結:https://cloud.tencent.com/developer/article/1146677?fromSource=waitui

歡迎大家前往騰訊雲+社群或關注雲加社群微信公眾號(QcloudCommunity),第一時間獲取更多海量技術實踐乾貨哦~

相關文章