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