2018-07-30 09:55:42來源:GameRes游資網(wǎng)編輯:誠
MMORPG游戲中的AI,不是指廣義的人工智能,而是特指在游戲內(nèi)NPC能夠通過環(huán)境或者事件的變化進(jìn)行邏輯判斷,從而同玩家產(chǎn)生特定的交互行為。它主要包含三個(gè)部分,分別是感知、決策、行動。
感知:是指偵測周圍環(huán)境變化的能力,如玩家進(jìn)入視野、受到攻擊等;
決策:就是根據(jù)環(huán)境變化思考做出何種反饋,是整個(gè)AI框架主要的構(gòu)成部分,常見的有狀態(tài)機(jī)、行為樹;
行動:即NPC做出的具體反饋,如釋放技能、尋路等操作。
MMORPG AI是構(gòu)建在尋路、移動、技能、視野這4個(gè)基礎(chǔ)功能之上的,尋路、移動和技能屬于行動,而視野更多是一種感知。
AI常見的三種實(shí)現(xiàn)方式
01、樸素的AI-Hard Code
舉一個(gè)游戲中常見的例子,一只野豬在沒有人的時(shí)候需要自動巡邏;當(dāng)有人進(jìn)入視野的時(shí)候,它需要去接近這個(gè)玩家;當(dāng)它和玩家的距離達(dá)到2米的時(shí)候,它要發(fā)起一個(gè)技能;當(dāng)它血量低于20%時(shí),它要逃跑。而隨著我們游戲開發(fā)的深入,NPC越來越多,比如小鹿不會攻擊只會逃跑,狼不會逃跑但會釋放技能。
這時(shí)候問題就出現(xiàn)了,我們?nèi)绻麨槊恳粋€(gè)NPC單獨(dú)實(shí)現(xiàn)一份AI,一款游戲可能有上千種NPC,工作量會非常巨大,而且非常難以擴(kuò)展和維護(hù)。但樸素AI簡單、直接、效率非常高,一般在項(xiàng)目初期應(yīng)急時(shí)使用,即項(xiàng)目上線之初,沒有時(shí)間、沒有能力去做AI的時(shí)候,可能簡單寫一個(gè)AI先去做測試使用。
02、有限狀態(tài)機(jī)
狀態(tài)機(jī)可以歸納為三個(gè)要素,即現(xiàn)在的狀態(tài)、事件、動作。當(dāng)一個(gè)事件發(fā)生,將會觸發(fā)一個(gè)動作,或者執(zhí)行一次狀態(tài)的遷移。
狀態(tài)機(jī)有3個(gè)缺點(diǎn):第一是狀態(tài)流程圖過于復(fù)雜,非常難以維護(hù);第二是難以擴(kuò)展,新加狀態(tài)的時(shí)候需要考慮已有狀態(tài)間的關(guān)系;第三是策劃不能充分參與其中,只能由程序員來完成,這會增加程序員的工作量。
03、行為樹
行為樹里面有一個(gè)根節(jié)點(diǎn),有若干子節(jié)點(diǎn)。節(jié)點(diǎn)主要分為控制節(jié)點(diǎn)、條件節(jié)點(diǎn)和行為節(jié)點(diǎn),條件節(jié)點(diǎn)和行為節(jié)點(diǎn)執(zhí)行都有一個(gè)結(jié)果,成功、失敗或者正在運(yùn)行中,控制節(jié)點(diǎn)會根據(jù)返回結(jié)果執(zhí)行下一步動作。
行為樹的優(yōu)點(diǎn)是邏輯直觀、一目了然,策劃可以借助工具直接配置,不需要程序介入。而缺點(diǎn)則是樹分支數(shù)量龐大,每次遍歷尋找合適節(jié)點(diǎn)的過程消耗高。
AI尋路的四種實(shí)現(xiàn)方式
01、直線尋路
直線尋路最簡單,平時(shí)經(jīng)常用的直線生成算法都可以拿來用,但也最容易失敗,因?yàn)槲覀冋麄€(gè)地圖不都是一個(gè)大平原,它可能有各種各樣的阻擋。
02、貪心尋路
貪心尋路的策略是每次都朝著距離較近的方向逼近一步,如果某一個(gè)方向不能走,就嘗試另一個(gè)方向。其實(shí)它還是不夠聰明,當(dāng)它遇到阻擋的時(shí)候,它可能要繞很遠(yuǎn),或者要執(zhí)行很長時(shí)間才能真正找到它的路徑。
03、A*尋路
A*尋路從任意一點(diǎn)開始的時(shí)候,把它四周的幾個(gè)點(diǎn)放到open表里,然后從open表里取出估價(jià)函數(shù)最小的點(diǎn),同時(shí)更新open表和close表。其中的close表負(fù)責(zé)存儲考察過的點(diǎn),open表儲存已生成而未考察的點(diǎn)。
估價(jià)函數(shù): f(n)=g(n)+h(n)
g(n)就是起點(diǎn)到當(dāng)前點(diǎn)的代價(jià);
h(n)是當(dāng)前點(diǎn)到終點(diǎn)的代價(jià)。
04、導(dǎo)航網(wǎng)格尋路
大平原地圖是由很多小格子組成的,如果尋路時(shí),還需要去遍歷每個(gè)小格子的話,那么大量的時(shí)間會浪費(fèi)在每個(gè)小格子的計(jì)算中。
這時(shí),可以讓導(dǎo)航網(wǎng)格預(yù)處理,把地圖大平原切割成一個(gè)個(gè)凸的多邊形。多邊形之間,會通過一定的數(shù)據(jù)結(jié)構(gòu)聯(lián)合組織起來,在這個(gè)多邊形中再通過A*去尋路,這樣就可以一下子跳過很多格子,一次就找到目的地。
我們在游戲里面不是只有一種尋路算法,一般來說,首先看直線尋路能不能到達(dá),如果可達(dá)就直接返回了,如果失敗,再嘗試尋找更復(fù)雜的一條路徑,會依次地去嘗試貪心尋路、A*尋路、導(dǎo)航網(wǎng)格尋路等方法,直到找到可以到達(dá)目的地的路徑。