《The Last Of Us》的同伴AI(二):戰鬥跟隨AI

《The Last Of Us》的同伴AI(二):戰鬥跟隨AI

來自專欄兔四的遊戲攻略書

第三章 戰鬥狀態下的跟隨AI

行動集的概念

我們先提一個在頑皮狗遊戲里都會用到的設定:行動集(Action Pack)。

我想在座各位都接觸過類似的東西:遊戲中我們會有個可以移動的場景,場景地面布上導航網格,然後會有很多很多的多邊形來告訴角色哪裡可以行走、哪裡不可行走。

平時我們的角色只會走路、跑動或者拔槍攻擊,我們希望在場景中某些位置上能夠激活玩家的額外行動,我們就把這個邏輯就稱之為行動集。我們也可以把它理解成為角色在環境中潛在的互動行為,當玩家在對應位置上就會激活這個行動。

行動集的類型

行動集一共有三種類型:

第一種叫做影片觸發點(Cinematic Action Packs)。當角色走到這裡的時候就會激活一些影片,也就是進入劇情。這類我們用得不算很多,大多數在章節切換的時候會用到。平時很少用則是因為可能會有很多NPC或怪物介入並影響玩家,通常都會在一些很安全的地方才用到。

(插一句,相比之下,努力做到一鏡到底的《戰神》則相當頻繁地使用這一點,而且效果驚人,經常都會意識不到自己在操作角色、還是劇情在操作角色)

第二種則叫做額外移動觸發點(Traversal Action Packs)。這就是那些可以讓玩家跳躍、攀爬的點位,玩家移動到對應的地方就能激活這個行為。這個非常好理解,在遊戲中很多的房間內、箱子上、汽車上、梯子旁都有類似的觸發點。比如下面這個圖,兩個窗口都是額外移動觸發點,角色可以通過這裡翻到房間外、或者從外面跳入房間內。

第三種就是掩體觸發點(Cover AP),這就是那些可供玩家潛伏的點位,用掩體來進行潛行攻擊或者躲避傷害,玩家在這裡可以通過蹲伏的姿勢來藏在掩體後面,然後進一步進行戰鬥。看下面的圖,用有顏色的線段標出來的位置就是可以使用的掩體,其中橙色和藍色的線段分別表示玩家可以通過蹲姿或站姿來進行掩體掩護。

上面這個圖還可以再說一個細節,注意中間這輛車的車頭位置,這裡是沒有掩體觸發點的,原因是這樣:

我們開發了一系列工具來自動生成這些橙色和藍色的線段,但工具並不是100%完美的。《最後生還者》是一個支離破碎的廢土末日世界,它並不是由大量規整的房間和平面組成的,所以如果一個物件或者障礙物剛好比我們設定的最低掩體要矮一厘米,那它就不能成為我們的掩體觸發點。這就是為什麼有些車頭能成為掩體、有些車頭不能成為掩體的原因。

理論上我們的遊戲設計師們可以手動去調整這些東西,但這工作量太大了。而更重要的是,很多地方我們沒必要去做,因為在絕大部分的場景內玩家的敵人都是感染者,沒什麼強盜暴徒這些,而感染者並不會使用任何行動集,所以我們的設計師們就不用花時間在這上面了。

插一句,《最後生還者》其實有不少戰鬥要跟真人打,比如火螢、比如某些據點裡的劫匪等等,這裡可能是Max演講時的口誤。但那些戰鬥的場景一般都在有相對規整物件的地方,比如建築內部、倉庫中心等等,有上圖那種廢棄汽車掩體的場景不算太多。

不過我們的確有一些場景需要手動去調,比如我們會有些傾斜程度超過三十度的廢棄建築等等,工具不太好去生成掩體,而這些契合世界觀的場景又必須存在,那我們只好去一個個去做咯。

關於行動集的概念我們介紹得差不多了,讓我們回到同伴AI的主題。影片觸發點都是由玩家來觸發,艾麗不會使用;額外移動觸發點則是喬爾和艾麗都能使用的行動集,這一點也沒什麼好說的。所以我們下面會重點介紹一下艾麗對掩體的使用。

艾麗如何利用掩體

對於普通的NPC來說,他們基本不會使用到各種掩體。他們要麼成群結隊正面攻擊,要麼就在營地里等著玩家去潛行攻擊。

而對於喬爾(玩家)來說,喬爾在大部分戰鬥區域內都可以找到很多掩體,利用掩體進一步進行偵查或者攻擊,這是我們戰鬥的核心部分之一。每場戰鬥玩家都可以去選擇偷偷潛行殺完,或者是乾脆放棄掩體正面剛。

一旦喬爾進入掩體,我們需要讓艾麗也利用掩體來跟隨在喬爾身旁。有一個非常簡單方法就是,我們在每一個掩體周圍的一米內都做一個掩體,但這很顯然不太可行,在感官上不太和諧、同時也會影響潛行玩法的體驗。

我們把奔跑時間作為一個切入點來思考這個問題。

當艾麗在一個掩體後面、即將要前往跟隨喬爾時,我們會計算艾麗跑到周圍幾個掩體的路線,然後根據這些路線的移動所需時間、位置、可能要播放的人物動作等等參數,去得到不同路線的權重。

當喬爾在掩體之間移動時,艾麗不需要一直緊跟在喬爾後面,艾麗完全可以再喬爾後方的掩體里等待行。

所以,對於喬爾來說,喬爾面對的選項可能是各個不同的掩體,而對於艾麗來說,艾麗的選項則是各個「奔跑時間+掩體」。

喬爾又要來發射射線了

此時,喬爾不再像我們之前在非戰鬥環境中那樣朝弧形範圍發射射線了,而是以自己為圓心、朝身邊所有方向、每幀發射大約80根射線,這些射線最終會射到各種掩體和角色身上。我們通過這種方式來尋找喬爾旁邊的障礙,這些障礙是掩體,這些掩體就是艾麗要移動的目標。

然後我們還會在遊戲中特意設置部分特殊的掩體,這些掩體的完成度和安全性都很高,這些也會優先成為艾麗的目標掩體。一般會在關卡的入口附近、在敵人基本不會巡邏到的位置附近都會有這類掩體。這類掩體一般都是一些厚實的牆壁之類,玩家一眼看過去就會覺得這就是個掩體,艾麗躲在那兒也顯得非常合情合理,上文說的那種報廢的汽車車頭就不會是這類掩體了。

通過這兩個方法,我們就可以在整個遊戲世界中為我們的艾麗AI提供了足夠多的掩體觸發點,艾麗就可以根據AI來在戰鬥中進行合理的躲避和潛行。

舉個例子來方便理解射線

下圖灰色的就是障礙物,我們以喬爾為中心去發射射線,圖中為了比較好展示所以大大減少了射線的數量。這些射線的長度我們可以去定義,一般不會長,否則我們可能會得到一些距離喬爾很遠的掩體,這不合理。

然後我們就可以取得那些射線與障礙的接觸點。

你會注意到這些點有不同的顏色,它們是根據角度、距離地面的高度等等參數來分類,目的就是用來區分不同的牆面。分完類之後我們就會告訴艾麗說:「嘿!你要不要過來看看,這是一個掩體!」

此時,喬爾在發射射線時有可能會處於一些很奇怪的位置,這導致了我們生成的這些掩體有可能也會因為角度和高度的奇怪而變得不太符合常理。比如有可能會出現一些很小的掩體,而明明從視覺上看這個掩體還有很大的拓展空間,類似下圖淺藍色的區域。

所以我們需要每一幀都去通過上述的方式去生成對應的坐標點:

然後我們會保存一小段時間內生成的坐標數據,通過這些數據才來得出真正的掩體,就像下圖淺藍色區域那樣。

然後當我們擁有若干個程序生成的掩體後,我們會通過很多參數去計算它們的權重,比如距離友方角色的距離、距離敵方角色的距離、距離關卡目標的距離、掩體是在喬爾身前還是身後、這個位置能否被敵人看見等等。

接下來就是按照我剛才所說的,艾麗AI里的選項其實是「奔跑時間+掩體」,現在我們通過上面的方式得到候選掩體之後,就會去計算艾麗移動到對應坐標的時間,然後進行相應的移動。

下面這張圖就是一個實機展示。圖中很多密密麻麻的數字其實就是每個被生成的掩體的各種參數權重值,艾麗最終選擇權重最高的那個、也就是圖中綠色的那個掩體。在圖中上方的那個箭頭處其實有個隱藏在草叢後面的敵人,這也就是為什麼艾麗沒有選擇畫面上方掩體的重要原因了。

掩體共享

但這個做法會有個問題,如果艾麗一直處於喬爾周圍的掩體、或者在喬爾周圍的掩體中進行移動時,艾麗有可能會把玩家想要去的一些目的地給佔據掉。

比如玩家想去前面某個掩體後面以便射擊敵人或者投擲燃燒瓶,但艾麗卻意外地佔據了那兒,玩家倒是可以強行過去逼走艾麗,但這樣會顯得非常蠢。我們當然也可以給艾麗一個AI說,當喬爾要過來的時候艾麗就要離開,但我們有一個更好的方法。

這個方法叫做掩體共享。

我們決定允許喬爾和艾麗能夠同時處於一個掩體,並且當他們兩個位於同一個掩體後時會觸發一些動畫,比如喬爾通常都會用身體護住艾麗,像下面這個圖這樣:

這個方法不僅解決了上面說的掩體衝突問題,還給艾麗AI尋找掩體時多了一個還不錯的選項:喬爾所在的掩體也是一個可用的、而且還不錯的掩體。

除此之外,這對我們塑造喬爾和艾麗的關係有巨大幫助

如大家所知,我們希望玩家能感受到喬爾和艾麗之間接近於父女之間的感情,而掩體共享這件事情的確可以完美做到這一點。通過這個做法,玩家的確會感受到這是兩個有血有肉的角色。

當艾麗位於喬爾旁邊、而且艾麗判斷出她所在的位置更好時,她會通過對話來邀請玩家移動到她所在的掩體里。比如說艾麗發現喬爾的位置可能要被敵人觀察到時,或者艾麗的位置更靠近關卡出口時,就會出發這樣的邏輯。並且艾麗在喬爾過來了之後可能還會說:「哇,剛剛那太驚險了!」這也確確實實是一些能夠促進兩個人之間感情交流的一些做法。

那麼,在前兩章我們知道艾麗是如何跟隨喬爾、以及艾麗在戰鬥中是如何跟我們保持距離了。接下來第三章要講的就是艾麗在戰鬥中如何幫助喬爾,或者說是艾麗的戰鬥AI。


推薦閱讀:

有什麼火柴人遊戲?
絕地求生大逃殺到底是一款怎麼樣的遊戲?
幼兒遊戲146則
遊戲《生化危機》都有什麼角色?
iPad有什麼好玩的雙人遊戲?

TAG:遊戲 | 遊戲AI | 遊戲設計 |