人工製作 vs 系統自動化:《神祕海域4》 中的戰鬥AI平衡 解讀
作者:Rouder,本文首發知乎
地址:https://zhuanlan.zhihu.com/p/261111487
Part . 1
1.1 Combat Design in Uncharted 1-3
神海4團隊首先介紹了神祕海域第一部到第三部的戰鬥設計。神海前三部作品的戰鬥流程設計高度依賴硬編碼。
他們提出了分割槽式NPC的概念,NPC只可以在指定的區域進行移動、戰鬥。策劃需要在場景裡設定好區域,保證NPC整體上可以覆蓋到玩家所有可能的前進路線。
這麼做的優點是,NPC可以均勻地分佈在場景中,防止他們聚集到一起,還能產生一種NPC在智慧利用空間地假象。缺點是,策劃需要想到玩家所有可能前進的路線,為所有路線設定好分割槽。由於前三部的戰鬥場景比較小,戰鬥流程較為線性,所以分割槽式NPC機制執行良好.但是第四部的戰鬥場景得益於PS4的效能而擴大了很多,此機制沒有辦法良好運作。
在給NPC手動分配區域需要一些技巧。首先要讓場景中地部分NPC的分割槽跟隨玩家進行移動。這種區域作為前方戰線, 使得玩家無論移動到哪裡都可以感受到NPC的存在,保持戰鬥過程的持續緊張感,不會走到一個地方就突然沒有了敵人。然後讓場景中部分NPC的分割槽固定在場景的出口附近,並且將這些區域設定得大一點。這種區域作為後方戰線,而且在戰鬥結束後,玩家正好面對出口,起到了引導玩家前進的作用。最後讓場景中部分NPC的分割槽固定在視野最好的地方,並且將這些區域設定得小一點。這種區域作為聚集點存在。
狙擊點
上面提到的區域不但可以靜態設定,還可以在執行時根據戰鬥情況進行調整。接下來用兩個例子進行說明。首先來看一下第一個例子,注意觀察左方陽臺的NPC。
動態分配區域:玩家走左邊的情況
系統自動為一個NPC分配了一個區域在陽臺上
動態分配區域:玩家走右邊的情況
系統自動為一個NPC分配了一個區域在陽臺下方。然後玩家等NPC走到油桶附近再把油桶打爆,瞬間可能覺得自己很帥,但是其實都是策劃設計好的。
再來看一下第二個例子
動態分配區域的例子二
前方的NPC倒下後,後面的NPC分割槽會依次設定到前方。有利於保持戰鬥節奏,持續給予玩家壓力。
1.2 Uncharted 4 Design Goals
由於遊戲的執行平臺從PS3升級到了PS4,效能得到了提升。團隊希望實現在大場景下的戰鬥,以下是馬達加斯加的戰鬥場景。
雖然還是線性戰鬥流程,但是增加了廣度。神海前3部所使用的單純的分割槽式NPC機制不再適用,神海團隊對該機制進行了調整。
有了這麼大的場景,就希望提升主角攀爬能力在戰鬥中的實用性,所以可探索的垂直空間也增加了。NPC也需要由一套良好的系統來處理攀爬。
前三部在潛行的過程中被法線就沒有辦法回到潛行狀態。這次需要實現一套完整的潛行迴圈流程,在非戰鬥、戰鬥、潛行狀態之間進行切換。
一場戰鬥中同時出現的NPC數量從8個增加到了16個,需要更好地排程敵人。
降低策劃地工作量
1.3 Fundamental AI Technology
已有的以及為實現神海4設計目標而提出的基礎AI技術
1.3.1 框架概念
Skill擁有一個狀態機,例如戰鬥Skill地狀態機有開放戰鬥狀態和掩體戰鬥狀態。Skills是一個由Skill組成地優先順序列表,執行時會實時判定各個Skill是否開啟,然後再所有被開啟的Skill中選擇優先順序最高的Skill作為當前Skil。Behaviour代表具體的行動,例如移動到一個點、進行設計。Locomotion Controller用於移動NPC和驅動動畫,類似Unity的Animator。Bahaviours是一個由Behaviour組成的堆疊,還會去合理的呼叫Locaomotion Controller。當Skill的狀態機確定一個狀態後,會將多個Behaviour壓棧到Behaviours。
1.3.2 Post
Post是地圖上的位置標記,供NPC使用
1.3.2.1 手動標記的資料
黃色區域代表可正常行走區域,綠色區域代表可潛行區域
綠色線段連結的地方可以執行特殊的動畫(例如上竄下跳、躍過裂縫、翻越掩體等)來越過障礙。這些特殊動畫都需要定義入口、迴圈體、出口,所以一個動畫可用於翻閱各種距離的障礙。
綠色線段標記了各個攀爬區域,橙色線段標記了各個攀爬點的連線處,這些標記可以讓同伴NPC執行玩家的部分攀爬動作。
1.3.2.2 生成Post
引擎會利用以上手動標記的資料自動生成所有Post。下圖中,Green Post代表開放戰鬥點,NPC會在這些點進行戰鬥操作,例如開搶、扔手雷、拳擊等。Organge Post代表掩體點,NPC會在這些點位躲避來自玩家的攻擊。Teal Post代表制高點,NPC會在這些點進行狙擊、探頭射擊等。Purple Post代表攀爬點,NPC可以攀爬到這些點位上,利用垂直空間。
1.3.3 Post Selector
生成了大量Post之後,就需要用Post Selector模組來為為當前正在執行的Behaviour所屬的NPC對各個Post進行評分,最後選中總得分最高的Post執行Behaviour。Post評分的指標有。NPC位於此Post時能否看見主角,能看到主角可以獲得更高的分數;NPC到此Post的距離,距離越近獲得的分數更高;此Post是否位於NPC所屬的分割槽,不在分割槽內部的Post都直接零分。間接限制了NPC只能在自己所屬的分割槽內移動、戰鬥,前三部中使用的分割槽式NPC機制在這裡得到了保留。
例子
1.最下面的NPC正在射擊玩家
2.突然決定靠近主角
3.Behaviour使用Post Selector來選擇最合適的Post來執行具體操作,更詳細的講解請參考Travis McIntosh GDC 2014 "The Last of Us Human Enemy AI"
4.評分情況
上圖中,綠色Post代表得分非常高的Post,這些Post距離NPC較近、NPC躲在該Post的掩體後面可以正對主角、NPC距離主角較遠(因為NPC使用的是步槍,方便射擊)。紅色Post代表得分比較低的Post,這些Post距離NPC太遠、距離主角太近。
上圖中全是零分的點,因為NPC躲在這些Post的掩體後面沒有正對主角且遮擋視線、比當前NPC所處位置更加遠離主角。
5.最終選擇
1.4 Thing That Didn't Work
接下來會講解神海團隊開發早期的失敗嘗試。
團隊首先嚐試同時使用分割槽式NPC機制和Post Selector機制。第一張圖中央的NPC的分割槽被設定在瞭如圖所示的立方體中,NPC沒有任何行動,AI當機了。具體原因是,NPC處於Combat Skill,Combat Skill需要使用Post Selector去選擇一個合適的Post。出於效能考慮(不止),只對在以主角中心,半徑為25米的一個球範圍內的Post進行評分,最後選取評分最高的Post執行Behaviour。由於地圖較大,主角距離NPC過遠。由於這些Post都在NPC所屬的分割槽之外,Post Selector給這些點都打了零分。
這是一個相當基礎的框架設計瑕疵,分割槽式NPC機制和Post Selector機制完全脫節。在設計的一開始就沒有考慮它們之間的相互配合。按理來說,一個有著這麼多年遊戲製作經驗的團隊不應該會犯這樣的錯誤。
隨後神海團隊設計了一個新的系統來代替分割槽式NPC機制,需要實現NPC能夠分散分佈以及智慧佔據空間。
1.4.1 新系統的首次嘗試
為了讓戰鬥更有層次感,加大了武器射程對戰場層次的劃分。因為主角地移動速度還是相對較快,NPC需要配合移動,最終導致肉眼可見的NPC頻繁同時轉移位置。如下視訊所示
NPC頻繁調整位置
1.4.2 新系統的後續嘗試
為了更好地對候選Post進行評分,神海團隊提出了連線度(Connectivity)和地理優勢(Vantage)兩個概念。
連線度需要利用navMesh生成的網格自動識別出特徵地點,例如房間門口、走廊等。但是隻適用於人工建築,不適用於自然場景。因為人工建築的空間相對較小,navMesh網格的解析度足夠大。而自然場景的空間相對開闊,navMesh網格的解析度不夠大。這個衡量指標沒有在神海系列作品中使用,但是在隔壁的《美國末日》系列作品中大量使用。
地理優勢用於處理在NPC看不見主角的情況下,應該選擇移動到哪個Post。下圖中橙色的區域代表主角從NPC的視野內消失時,在3秒內大致可移動到的位置。從每個候選Post開始向橙色區域內的所有Post打出射線進行檢測,綠線代表無遮擋,紅線代表有遮擋。最終選擇綠線最多的候選Post進行移動。
上面所提出的兩種度量指標都沒有辦法適應所有的遊戲場景。很大的一個原因是這兩種度量指標都是對策劃的高階決策進行逆向工程得到的,都是在嘗試將策劃的具體想法轉換成一套通用的自動化演算法。這樣得到的演算法限制了策劃為每場戰鬥增加獨特性,因為演算法的成功執行總是存在一定的前提條件,在前提條件的限制下,策劃可配置出來的結果也受到了很大的限制。而且演算法的執行總是存在著一定的規律,玩家多次遊玩之後總是能察覺出這個規律。當然,遊戲的玩法總是會存在或多或少的規律,非核心玩法可以有些許規律,但是核心玩法的規律越模糊越好。這樣遊戲的可玩性,玩家的探索欲才會足夠強。
1.4.3 Search Skill的首次嘗試
前面有提到神海4需要實現一套完整的潛行迴圈流程。主要的難點在於,玩家消失在所有NPC的視野之後,NPC應該如何展開搜尋。
當玩家消失在所有的NPC視野之後,NPC最後一次看見玩家時玩家的所在區域會會被設定上一個初始的熱度值。如下圖所示,紫色表示很熱,藍色表示很冷。
NPC開始搜尋後,會以熱度值為優先順序依次搜尋各個區域,期間視線掃過的區域的熱度值會不停下降,如下視訊所示。
NPC依據熱度值搜尋各個區域
從上體視角來觀察NPC的行為會覺得很正常、很自然,但是從玩家的視角來看就沒那麼自然了。這個搜尋演算法存在以下缺點。
玩家難以預測NPC的移動路徑,NPC會經常突然180度轉向,正常人很少會頻繁180度轉向。當玩家看著NPC漸漸走遠,衝出草叢準備轉移位置時。NPC這時突然轉向就很尷尬。
NPC還會成群結隊一起展開搜尋,因為大家都按熱度值對待搜尋區域進行搜尋。
NPC不容易觀察到一些地圖邊緣的點,這些點所在的區域熱度值一直降不下來,NPC會不斷去檢視這些邊緣區域。最終導致場景的中央很空曠,玩家很輕鬆地大步通過這個場景。
存在這些缺點的根本原因是神海團隊從NPC的視角去設計Search Skill。遊戲是為玩家設計的,而不是為NPC設計的。我們應該要從玩家的視角去設計遊戲,儘可能地保證玩家遊戲體驗良好,即使實現上不是那麼地符合現實。
1.4.4 失敗總結
神海團隊在給神海4做設計時,想要從過去的人工配置模式完全轉換成系統自動化模式。希望大幅度降低策劃的工作量,提升系統的智慧化程度。但是這個轉換用力過猛,步子大了扯著x,導致神海團隊做出了很多錯誤的系統設計。所以我們在進行全面的系統設計時要在人工配置和系統自動化之間找到平衡點,越早越好。
Part . 2
2.1 Solutions We Shipped
首先來講解神海團隊最終在神海4中使用的解決方案。
2.1.1 Hard Point
一個hard point由Name、Zone Region、Minimum NPCs、Maximum NPCs、Toggle這幾個欄位進行描述。Name代表該hard point的名字。Zone Region代表該hard point佔據的空間。Mimimum NPCs代表該hard point需要被分配的最少NPC數量。Maximum NPCs達標該hard point可以被分配的最大NPC數量。Toggle代表該hard point是否啟用。
NPC可以被動態地分配到一個hard point上,NPC必須要在它所屬地hard point中才可以執行其行為。如果NPC不在它所屬的hard point裡面,該NPC會想辦法到達它所屬的hard point中。
場景中會有很多的hard point和NPC,神海團隊設計了Hard Point Coordinator模組來為每個hard point合理地分配NPC。
為場景配置hard point的一個例子
2.1.2 Combat Roles
現在完成了為場景各個區域分配NPC的設計,但是神海團隊遇到了另一個困難--NPC在它們各自所屬的區域中該幹什麼。於是他們去研究了一些經典遊戲,最終在《吃豆人》這個遊戲中獲得靈感。
2.1.2.1 吃豆人的角色
在《吃豆人》這個遊戲中,紅色鬼魂Blinky是一個主動進攻型的角色,它會不停的追蹤主角。粉絲鬼魂Pinky也是一個主動進攻型的角色,它會追蹤主角正前方兩格的位置。橙色鬼Clyde是一個會和主角保持距離的角色,當距離主角比較遠時,會開始追蹤主角。當距離主角比較近時,會開始往地圖的一個角落移動。藍色鬼魂Inky會追蹤 紅色鬼魂的位置以主角朝向為軸進行翻轉後得到的位置,在神海4中沒有與之對應的角色。
2.1.2.1 神海4的角色
參考了《吃豆人》的角色設計後,神海團隊也為神海4設計了三個角色,分別是交戰者、伏擊者、防禦者。
- 交戰者(Engagers)
交戰者會主動靠經並攻擊主角,post selector會以主角為選擇範圍中心
- 伏擊者(Ambushers)
伏擊者會暗中突襲主角,post selector會搜尋出距離主角20米範圍內的post,預測主角的前進路線,選擇其中一個post作為post selector選擇範圍中心。
- 防禦者(Defenders)
防禦者一般會在原地固定不動,post selector會以hard point作為選擇範圍的中心
- Encounter Coordinator
神海團隊設計了Encounter Coordinator模組來合理分配上面提到的三個角色。NPC會向該模組申請成為某類角色,然後開始執行以下分配步驟。
第1、4步其實是在分配防禦者,需要Hard Point Coordinator的協助。第2、3步中的X、Y的取值範圍一般為[2,3]。第5步並不希望執行,算是一種fallback策略,在開發期間如果跑到了第5步就會彈出巨大的警告通知策劃進行調整。
- global combat params
global combat params其實就是一張場景戰鬥引數配置表,策劃需要手動在這張表裡配置資料。下面講解一下這張表裡的一些欄位。
Time delay to replace an engager:當一個交戰者被殺後,分配新交戰者的延遲
Snuck away diatance for stealth:主角回到潛行狀態時,NPC開始搜尋所需要達到的距離,距離定義為NPC最後看到主角的位置到當前主角位置的長度
- Timer for advancing:NPC切換掩體的時間間隔
- Timer for grenades:NPC投擲手雷的時間間隔
- Timer for flanking:NPC從側面包抄的時間間隔
- Min flank path rating:NPC選擇包抄路徑時可接受的最小分數。該數值越小,敵人包抄進攻就越猛
Min/Max shooters:同時開槍的最小\最大NPC數量。建議同一時間只有3~4個NPC同時開火,少了會無聊,多了會太難。該欄位可以控制戰鬥的壓力,讓戰鬥保持在一個穩定的壓力水平。為了對主角隱藏NPC有同時開火數量限制這個設定,神話團隊設立了Shooter(槍手)角色。該角色和之前提到的角色屬於不同的layer,由NPC Coordinator模組進行分配。當NPC換彈、看不見主角時,會主動放棄該角色的所有權,NPC Coordinator會將角色分配給其他可以開火的NPC。這樣,Shooter角色會以一定的頻率在所有NPC中流轉,主角會以為所有NPC都可以開槍,只是開槍的時機不同,並沒有限制同時開火的NPC數量。效果如下視訊所示。
Shooter角色在所有NPC中流轉
2.1.3 Search Skill的最終實現
- 交戰者、伏擊者
交戰者、伏擊者的Search Skill最終實現
通過樣條來控制NPC的移動路線。路線策劃在場景中配置樣條曲線環的位置、形狀、同一時間沿一條曲線搜尋的NPC數。這裡有一個小技巧,如果給一條曲線同時分配兩個NPC,則可以實現NPC在搜尋過程中的互動效果,例如對話、眼神交接等。NPC一般情況下沿著曲線進行搜尋,少數情況下回去檢查某些特殊位置(掩體後方、峭壁邊緣等)。NPC走完一條曲線之後,會自動移動到最近的曲線,沿著新到達的曲線進行移動。
這個方案的優點是,NPC移動會更加地自然,並且可預測,不會再出現之前熱力圖搜尋那種突然回頭的情況;NPC不會扎堆一起進行搜尋,因為可以設定同一時間沿一條曲線搜尋的NPC數;NPC不會走到地圖邊緣,只要策劃配置地曲線不在地圖邊緣,NPC便不會走過去。
- 防禦者
讓NPC移動到其所屬Hard Point的區域範圍內地理優勢最好的post。
2.1.4 各個模組之間的聯絡
2.2 Evergreen AI Techniques
這一節會講解神海1到神海4都在使用的AI技術
2.2.1 Combat Params
遊戲中會存在一張表,這張表用來配置每個NPC的戰鬥引數。
2.2.2 Grenade Director
神海團隊設計了一個模組Grenade Director,該模組會讓NPC向玩家扔手雷。玩家看到手雷之後會因為要躲避手雷的爆炸傷害離開掩體,避免主角一直躲在掩體後猥瑣射擊。
實現方式是,當主角在一個地方停留下來之後,便開始倒數計時;如果主角離開這個地方到達一定的距離,計時清零;如果計時器達到規定數值,則挑選場景中最有空閒的一個NPC成為Grenade Thrower。Grenade Thrower和Shooter屬於同一layer。Grenade Thrower會與主角保持一定的距離然後扔手雷。
Grenade Director演示
2.2.3 Flanking
Flanking模組會派NPC去包抄玩家。玩家可能就會覺得這個地方不再安全而離開。通過這樣的方式可以避免主角一致躲在掩體後面進行猥瑣射擊。
實現方式是,當主角在一個地方停留下之後,便開始計時;如果主角離開這個地方達到一個距離,計時清零;如果計時器達到規定數值,則從所有NPC中挑選最有空閒的成為Flanker。Flanker會在避開主角視線的同時繞到主角身後攻擊主角。Flanker和Shooter屬於同一layer。
問題是如何避開主角視線。神海團隊對主角視線這個概念作出了定義。如下圖所示,黃色的圖形代表玩家視線,該圖形會根據玩家的位置和朝向實時進行調整。NPC只要通過尋路系統便可以避開玩家視線。
2.2.4 Accuracy Ramping
該機制的用途也是阻止玩家一直躲在掩體後進行猥瑣射擊。NPC在發現玩家後,會根據與主角之間的距離獲取一個時間,NPC會在這個時間內將瞄準精度提升到最高,百發百中。玩家會因為敵人的命中率提升而感覺到這個地方不安全,開始切換位置。
瞄準精度隨時間的變化通過curve定義。curve的描述方式如下圖所示。
2.2.5 Perch Posts
當NPC移動到這些Post時,會切換到一種特殊的射擊方式,比如探出半個身子進行射擊。
NPC在Perch Posts探頭射擊
2.3 Limitations
雖然神海第四步作品非常優秀,但是神海4最終採用的解決方案也存在著缺陷。
Post Selector的程式碼中有很多Magic Number,開發者本人也不知道這些數字具體代表什麼意思,給後續的維護帶來了困難。這種缺陷在需要長期開發/維護的網路遊戲中是絕對不容許存在的。
伏擊點的生成演算法不好。
如上圖所示,懸崖下的post雖然也在20米範圍內,但是在這些post中伏擊的意義不大。針對這種情況的臨時解決方案是將此場景的伏擊者總數設定為0。
玩家可以用一把手槍擊殺50米以外的NPC,過於強大。神海團隊一直都知道這個bug的存在,但是一直沒有去修復。演講者給出的解釋是:“經過多次測試,大多數玩家總是認為子彈總是可以完美擊中準心中心點。如果擊不中,玩家會覺得槍like a shit。”
2.4 Conclusion & Takeaways
下面是神海團隊總結出來的經驗和建議。
Don't reverse-enginneer high-level decision making(不要嘗試對高階決策進行逆向工程)。因為這樣做會提高開發成本,具體決策轉換為抽象程式碼之後,之後新增的需求也需要“適配”到抽象程式碼。策劃可能並不知道具體決策被轉換成了抽象程式碼,所以後續提出來的需求極大可能是沒有辦法直接“適配”到抽象程式碼的。如果程式覺得非常有必要將具體決策變成抽象的,那就跟策劃去商量,直接將具體決策轉換成抽象決策。這樣之後策劃提新的需求都是在這個抽象決策上進行調整,降低開發成本。
Design NPC behaviours from the player's perspective(以玩家的視角來設計NPC的行為)。畢竟遊戲是為玩家設計的,只要設計可以給玩家帶來良好的體驗,即使有些設定不是很符合常理,也是可以接受的。
Author roles, then assign NPCs to them programmativally(人工編寫角色,系統根據規則為NPC自動分配角色)。需要為遊戲設計NPC時,可以人工硬編碼角色的行為邏輯。執行時交給相關自動模組去分配角色。
NPCs need a goal other than "shoot at the player":NPC在不對主角進行攻擊時,需要有其它事情可以做)。在做一個偏向寫實風格的遊戲時,NPC絕對不可以沒有事情幹,需要保證每時每刻NPC都有自己的任務。
相關文章
- 動作遊戲戰鬥系統總結歸納&思考(中)遊戲
- 《戰神4》的風力&植被互動系統
- 讓SpringBoot自動化配置不再神祕Spring Boot
- 角色動作系統概述:戰鬥、3C相關
- 強化戰鬥體驗?當動作遊戲中的敵人設計搭載了AI遊戲AI
- 分析師:《神祕海域》票房表現遠超預期
- 《戰雙帕彌什》戰鬥系統解析:適合手機的動作遊戲遊戲
- 動作遊戲戰鬥系統框架總結歸納&思考(上)遊戲框架
- 揭祕 · 外賣系統背後的AI人工智慧AI人工智慧
- UI 自動化錄製與回放系統UI
- 一文讀懂自動駕駛中的機器人作業系統ROS自動駕駛機器人作業系統ROS
- GDC 2019《戰神4》開發解讀:全域性光照
- 楚留香戰鬥系統拆解與製作(三):基本行為之普攻邏輯拆解
- 中國AI背後的一股“神祕力量”AI
- 頂級玩法設計師GDC分享:《戰神》如何做出最優秀的戰鬥系統
- 基於32的平衡小車製作
- 製作Linux系統SD啟動卡Linux
- macOS製作系統啟動盤教程Mac
- 加速建立基於人工智慧機器人的自動化系統MK人工智慧機器人
- 加速建立基於人工智慧機器人的自動化系統TMG人工智慧機器人
- DataPipeline王睿:業務異常實時自動化檢測 — 基於人工智慧的系統實戰API人工智慧
- 石頭剪刀布?多人動作競技遊戲《永劫無間》戰鬥系統簡析遊戲
- 【GDC 21】《對馬島之魂》戰鬥系統講解
- 揭開C++移動與複製的神祕面紗C++
- PPTAutoPlay V2.0--製作具有自動語音朗讀功能的PPT
- 遊戲平衡機制探究:動態難度調節的4條祕訣遊戲
- win10系統製作U盤啟動時U盤變為只讀怎麼解決Win10
- 製作的Fedora啟動U盤無法引導系統的解決方法
- 《神祕海域》Amy Hennig:3A遊戲處於講故事的“十字路口”遊戲
- 人工智慧——冷軋線光整機輥自動化清洗系統人工智慧
- 戰鬥解析完成!「#COMPASS戰鬥天賦解析系統」公測開啟
- [譯]Webpack 4 — 神祕的SplitChunksc外掛Web
- 揭祕JavaScript中“神祕”的this關鍵字JavaScript
- 揭祕:人工智慧深度神經網路的4種精簡除錯方法人工智慧神經網路除錯
- 《碧藍幻想:Versus》的創新戰鬥系統
- UE4藍圖AI角色製作(三)AI
- 談談ACT手遊戰鬥系統
- Chrome實現自動化測試:錄製回放網頁動作Chrome網頁