主題 達人專欄

[開發知識]狀態機與行為樹,那遊戲AI中最常用的兩個架構

靈巧 | 2021-04-03 21:21:32 | 巴幣 6802 | 人氣 1233

AI是遊戲中非常重要的一環,如果要做遊戲,那除非是想做解謎、益智或文字冒險類的,不然AI設計基本是跑不掉。畢竟AI是跟玩家互動中不可或缺的一環,想想看,如果那些動作遊戲裡的敵人都不會動的話,那有什麼好玩的,對吧?

那不知你是否曾經想過,遊戲中的那些AI到底是長什麼樣子的?他們又是如何運作?整體架構到底是什麼?講到這裡,或許腦中就開始有一大堆數學邏輯之類的什麼玩意開始打結了吧? 畢竟如果沒學過程式,聽到AI大概就是毫無頭緒的、不明覺厲的樣子。

以這次我想在此淺聊一下關於遊戲AI的基本架構,簡單介紹一下所謂的遊戲AI到底是如何運作的,而又是怎麼設計出來的。由於主要是簡單講一下主流的遊戲AI以及設計邏輯,所以沒學過也不用怕看不明白,只是基本的概念而已。換句話說,如果有學過一點程式,應該會覺得廢到笑出來吧

另外,AI架構也是遊戲開發中戰鬥或系統企劃中必須要會的技能,因為AI是企劃設計的,程式只是把它做出來罷了。所以若想成為遊戲企劃,AI會是一堂必修課程。(AI真的很重要喔╮(╯∀╰)╭)

世界上的AI架構有非常多種,複雜的可以到深度學習,簡單的也可以就是完全隨機或固定模式,還有許多像是模糊邏輯、目標導向、神經網路等等......而在遊戲中,最常使用的則是這兩個------"有限狀態機"以及 "行為樹"。而這,也是這次的主題。

嗨,我是靈巧,我又來刷存在了。廢話不多談,這次就來介紹一下在電子遊戲中,最常被使用的那兩個AI架構吧。









有限狀態機

首先,先來聊一下有限狀態機是什麼吧。

有限狀態機這個架構在電子遊戲還沒出現前就已經有了,只是是用在一些其他的資訊設備上。而電子遊戲出現後,他也就伴隨著電子遊戲混了好幾個世代。算是過去最經典的遊戲AI架構了。

它,簡稱為狀態機,英文簡稱是FSM。是表示有限個的狀態以及他們之間的轉移和行為的數學模型。

更白話一點,就是一種管理AI狀態及狀態之間切換的架構。裡面有許多狀態可以供AI去切換,讓AI做出對應的行為,例如:巡邏狀態下AI要到處閒晃、待機狀態下AI要站在原地、攻擊狀態下AI要拿出武器攻擊玩家。而狀態機就是管理這些狀態,以及他們之間的切換及行為,像是:巡邏或待機看到主角時要進入攻擊狀態;任何狀態被打中時則要進入受擊狀態等等......

▲有限狀態機就是一種狀態與狀態透過事件切換的架構。 那為什麼叫做有限狀態機呢?原因很簡單,就字面上的意思,他狀態是有限的,不論狀態再怎麼多,他依然是有限的數量。

這時可能有人會問,既然有有限狀態機,那無限狀態機呢?摁,你他媽問題真多。不是啦! 無限狀態機理論上存在,但實際上並沒有,因為目前還沒有人能夠真的創造無限多的狀態機。話說,狀態機是靠所謂的"事件驅動"的,也就是它並不會閒著沒事就突然切換狀態,而是一定發生了什麼事情才會切換。而這些事情可能是世界發生了變化(玩家觸發了事件,如按下開關),又或是自己發生了變化(某個參數到達閥值,如與玩家的距離過近)。

另外,狀態機一定會有入口,並且入口可能有多個(例如受擊狀態可以從很多狀態進入),但不一定會有出口(例如死亡不會再跑去其他狀態)。最後,一個狀態機同時只能進入一種狀態,如果想要同時有兩種狀態,那就必須再創造第三個狀態叫做"兩者並存",又或是直接使用兩個狀態機(就是兩顆腦袋的意思啦)。

▲一個狀態可能有很多個入口,但卻不一定會有出口

------這邊快速地拿經典遊戲小精靈來舉例吧!

小精靈這款遊戲應該家喻戶曉了吧? 扮演一個缺一口的起司塊,然後在一塊地圖上吃豆子,同時有四隻鬼會追你的經典作品。

而在這款遊戲中,裡面那些追逐玩家的鬼魂就是運用狀態機來驅動的。而他們的AI架構則非常簡單。只有幾個狀態:追逐狀態 及 逃跑狀態

在追逐狀態中,鬼會不斷追著玩家跑,但是一旦玩家吃到了大力丸,鬼則會進入逃跑狀態,嘗試逃離玩家。而這兩個狀態的切換判斷則是,玩家是否吃到了大力丸。

另外值得一提的是,狀態機架構雖然是一樣的,但裡面的行為卻不一定會一模一樣,所以小精靈中的四隻鬼,每隻在追逐狀態時的行動都不盡相同。

▲小精靈的鬼魂AI非常簡單,大概就是追逐跟逃跑,兩個狀態來回切換而已。(這邊把死亡略過)

而隨著時代改變,遊戲越來越大,AI能做的事要變得更多,那狀態機也就變得越來越複雜。到90年代尾的時候,一個敵人可能有好幾十個狀態可切換。更別說現今運用狀態機架構的3A級的遊戲,如:蝙蝠俠阿卡漢系列、毀滅戰士2016,狀態快百個都不在話下。

不過同時,狀態機隨著時間進步,也有了許多特殊的運用方式。像是以前狀態機的觸發很死板,所以老遊戲的AI很容易被玩家看破手腳,從而能運用手段讓AI進入想要的狀態,也就是俗稱的"卡怪"。所以為了讓狀態機能有足夠的不確定性而加入了隨機要素,讓狀態並不是絕對進入,而是有機率進入,形成所謂的"模糊狀態機"(FuSM)。如:即時戰略為了每場體驗不同,就運用模糊狀態機增加AI變數。

之後,2005年的戰慄突擊則將狀態機結合GOAP(目標導向),讓AI能夠在獲取場景資訊之後,自己決定要進入什麼狀態。從而讓AI有了所謂的"計劃",而非只是條件觸發就做什麼。這個也把狀態機的可能性推到了另一個境界。

▲狀態機架構越來越大後,狀態就會變多,連接的線也會變多
▲即時戰略的AI會使用模糊狀態機,保證每次跟AI遊玩的體驗都不太一樣。
▲2005年的戰慄突融合了G.O.A.P(目標導向),讓AI能自己選擇要進入什麼狀態,從而成功讓AI自己決定要做什麼。

但狀態機至2000年後,因為AI需要更複雜、需求更龐大,漸漸開始出現了一些問題。

第一點是容易肥大,要加一個行為就要新增一個狀態,而且有多少狀態會進入該狀態就有多少條線,因此會讓它趨於龐大,難以管理;再來則是因為狀態機相互依賴得很嚴重,所以都是一大坨互相連結的,線多的時候會看到眼睛脫窗,使Debug、追蹤的時候難以閱讀;最後一點是不易重複利用,一旦怪的行為不同就要新增完全特規的狀態,這點對於現今需求高效率的時代非常吃虧。

毀滅戰士2016為了方便管理狀態機,儘管使用了巢狀結構來管理(就是大狀態機包裹小狀態機)但依然還是無法解決狀態機容易肥大的天性,最後還是演變成一個非常消耗精力的體力活。

也因為毀滅戰士的每隻敵人的行為差異極大,所以有非常非常多的敵人狀態是特製的,完全無法共用,或沿用去其他專案。

▲當狀態機複雜起來的時候,看起來會非常恐怖,很難管理跟追蹤。
▲毀滅戰士2016為了管理方便,有使用這種巢狀結構,用大狀態機包小狀態機,但依然還是無完全解決肥大難以管理的問題。
▲因毀滅戰士2016中的敵人行為差異極大,所以每隻敵人的狀態機都很特規,無法共用

所以,對3A級的開發來說,使用狀態機是非常吃力不討好的事情(why are we still here, just to suffer?)。而這時,就是行為樹開始漸漸取代狀態機的時候了......







行為樹

行為樹在遊戲AI設計中算是後起之秀了,是從2000年開始漸漸的取代了狀態機。而最發揚光大的行為樹作品當屬席捲XBOX平台的最後一戰2。

行為樹,英文簡稱BT,不是那個什麼下載器,也不是死亡擱淺中黑糊糊的敵人嘿! 而是Behavior Tree的縮寫。行為樹是一種資料結構,藉由設計師定好行為的規則要 如何發生 以及 按照順序執行並交由電腦判斷的架構。

而之所以叫做樹則是因為他是仿照電腦科學中一套經典的樹狀資料結構。也就是說,他會從一個原點出發,然後往下分支越來越多的節點,並不會往回跑。簡單來說,它只會從上往下跑至尾端並結束,絕對不會出現逆流而上的現象。

▲行為樹的結構大致長這樣,從上往下長,並不向狀態機結合這麼緊密,沒有循環。

一般來說,行為樹的節點總共有以下四種類型。

Root:是AI起始地點,永遠在最上層,AI會從這裡開始往下走

Leaf:永遠在最下層,不會有比他更下層的類型,這也是行為的節點,像是移動、等待、攻擊、巡邏等行為通通都寫在Leaf中。 

再來則是兩個中層的類型,他們可以有上層也可以有下層。

Selector:中文叫"選擇器",顧名思義,用來根據訂定的規則來按照順序一個個尋找哪一個可以執。例如:它底下有兩個節點,"遠程攻擊"及"近戰攻擊",那Selector就可以根據設定的攻擊距離來按照順序尋找哪個攻擊適用,他會先看遠程攻擊適不適合,不適合再去看近戰攻擊。

Sequence:中文為"順序執行",這個就比較簡單暴力了,它就是直接將它底下的節點按照順序全部執行一遍。例如:它底下有"面向目標"以及"開槍",那他就按照順序先面向目標,然後再開槍。

基本行為樹就只有這四種類別的節點(其實還有Parallel,中文為"並行",但這算較進階的節點,較不常使用,故略過不提),然後透過將他們層層連結,就能創造出無數的AI行為。

應該發現上面標住的都是四個字"按照順序",他也是行為樹的特色。行為樹是完全按順序執行,所以上面不論Selector或是Sequence都是按順序尋找及執行。其中還有些所謂的Decorator可以塞在節點之中,來改變AI的選擇與判斷,但這要談就有點過於深入了。簡單舉例就是,裡面有個Decorator是CD時間,加在節點之中後就可以讓這個節點進入CD,一段時間內不會被反覆選中。

▲所以在知道節點名稱後,行為樹大致上會長這樣。

------聊完了行為樹裡面基本有什麼,那該來聊聊它是如何執行的了

AI在運行時,行為樹會從Root出發,然後根據當前的狀況以及設計師訂好的規則去評估現在要跑至哪個節點,最後跑到Leaf上,再按照順序執行Leaf的行為。而在執行完後,又從Root開始重新評估現在要做什麼。就這樣重複到天荒地老

簡單來說就是,不斷地從最上方跑到最下方,而最下方在哪裡則是透過自己評估去判斷。

另外值得一提的特色是,行為樹本身可以瞬間停止當前的行為,然後重新開始。最後一戰2中敵人就會因為玩家的某些舉動而直接停止當前的行為,重新評估現在要做什麼。像是在最後一戰2中,玩家進入載具後,AI就會中斷並重新思考要如何應對有載具的玩家。這時若他們周圍有載具,則會把進入載具放入第一優先。像這種瞬間中斷AI思考在狀態機中是極難辦到的。

另外,他與狀態機最大的不同是,之前說過,狀態機是"事件驅動"的,以自身當前狀態為出發點,每發生事件就會切換狀態,然後執行當前狀態的行為。

而行為樹則是"順序詢問",他每次都是從最上層Root開始,然後評估當前的狀況,再去按順序找可用的Leaf並執行,如此不斷循環。所以就邏輯上來講,行為樹並沒有所謂的"狀態",他只是評估並執行最適合的Leaf而已。

▲行為樹的運行邏輯是從上至下的,所以會從最上方的Root出發,然後一路透過詢問的方式找路走到最下方,在走到最下方後,執行最下方的行為,然後從頭開始。上方就顯示了,他先判斷是否看到目標,然後再判斷自己打不打得到,最後再選擇要做啥。
▲上圖的兩者AI行為一模一樣,但從比較圖中可以看出,左側狀態機連結比較緊密,右側則比較鬆散。(我知道上圖的AI應該可以更好,但只是展示用所以就將就點吧)
▲最後一戰2中,歸功於狀態樹可以瞬間中斷,故敵人會因為玩家坐上載具而中斷當前行為,並從頭開始思考如何應對有載具的玩家,所以看起來行為更加即時。

既然行為樹要判斷參數,那就必須提到行為樹的一個附帶元件-------Blackboard. 可以說有行為樹,就一定會有個Blackboard.

每個行為樹一定都會有一個搭配的參數列表,叫做"Blackboard",直譯為黑板。它裡面就用來存下各式各樣的數據,像是與目標的距離、有沒有發現玩家、手上的武器是什麼、最近的掩體、最近的載具等等...…而行為樹就是看著黑板上有什麼然後評估該幹啥。

通俗點講就是腦袋會去看黑板上寫了些什麼,然後再決定自己要幹嘛。

▲Blackboard的用意就是紀錄並給予參數讓行為樹做判斷

行為樹相較於狀態機,有非常多的優勢,其中最大的優勢就是增加開發效率。

首先就是它視覺上對設計師很友善。由上而下、由左而右,不像狀態機糾結成一團毛線。儘管它依然跟狀態機一樣,還是會有長得越來越龐大的跡象,但至少它是一套流水線工程,不會逆流而上或是重複迴圈,所以不論是管理還是Debug上都強上許多,對開發來說可以提升不少的速度。

再來則是容易復用,由於裡面的節點都是小行為堆疊而成,像是移動、等待、攻擊等等......並不像狀態機直接寫死在一個狀態內。因此這些節點共用性非常的高,想搬就搬,不但可以複製並用在許多其他位置,甚至也能用於其他專案。

▲此為GDC演講時展示的全境封鎖AI(他們的行為樹是橫著長的),可以看出他依然很龐大,但至少容易追蹤AI當前在幹嘛。
▲因為行為樹的節點可以寫的比較通用,所以很好共用,像圖中Move to 就兩側都有使用。

如今行為樹是3A級遊戲製作中最主流的AI架構,基本上只要做高成本遊戲,就是使用行為樹。畢竟3A級遊戲都太過龐大,AI會趨於複雜,行為可能有上百種,故使用狀態機架構實在不堪負荷。所以行為樹清晰、易追蹤、好復用的特性,就自然而然地成為3A遊戲開發的首選了。

不過雖然上面有談到,行為樹比狀態機的優勢大,但並不代表絕對優勢,兩者其實各有好壞。狀態機的邏輯比較貼近人類思考,自己在什麼狀態就想做什麼,邏輯比較直覺,比較好設計;而行為樹則是效率較高,在數量龐大時方便管理跟Debug,並容易復用,但邏輯必須要換位。

所以如果只是一些簡單的AI,行為的數量級不大的話,其實使用狀態機就行了,沒必要用行為樹自找麻煩。






總結

AI是遊戲開發中幾乎不可避免的一環,甚至可以說要做遊戲開發,那就九成會撞到AI設計,所以AI對於遊戲企劃來說是一項必修科目。想做遊戲系統、角色、戰鬥,那就要學會如何設計AI。

這邊只是簡單介紹了在遊戲開發中,最常被使用的兩個AI架構,給那些可能對遊戲設計有興趣的人掠一眼,建立一些底層概念。或者只是當茶餘飯後的知識分享也是可以。不過由於本人寫作火候不夠,所以無法到達看完就能成神的境界,甚至看完後可能八成還是不知道怎麼做,但至少能先有個初步了解。

或許敏銳的人已經發現了,AI架構在遊戲引擎內長的樣子跟我上面隨手畫的一些圖其實差不到哪去。你的概念沒錯,AI設計是可以紙上作業的,所以在設計AI的過程中,最初始的一步就是企劃先在紙上畫一個粗略的AI架構。然後再交給程式人員寫成功能,最後依然是企劃要去管理及維護。

所以若讀者對AI設計有興趣,其實現在就可以開始動手畫了。不瞞各位,遊戲企劃其中一個訓練方式就是把玩過的遊戲的AI嘗試自己畫下來看看。

再來,之所以寫這一篇文章也是為了之後想寫的專題做鋪墊,畢竟之後會有幾篇跟AI相關,所以若不先針對AI架構做介紹的話,不懂的人肯定會看得雲裡霧裡的,不懂我在講個啥XDDDD。

那之後的專題就還請各位繼續捧場了,我是靈巧,這次先談到這裡,下次再見。

以上一些資訊的來源:
對AI有興趣可以去看AI 101這個頻道,裡面還蠻多乾貨的。

其他AI相關文章:




送禮物贊助創作者 !
0
留言

創作回應

鄭曉麥
行為樹原來是用二元樹寫出來的?
2021-04-04 19:49:37
靈巧
呃....感覺不太算,行為樹的一個節點下可以有無限多個子節點,跟二元樹不太一樣,二元樹單一節點下只能有兩個。
2021-04-04 22:42:50
武內桑
寫的超好
2021-05-03 09:41:33
靈巧
謝謝:)
2021-05-05 20:29:36
JS
專業給推
2021-05-10 13:45:08
靈巧
Thanks
2021-05-11 09:03:41
Xmichael_
請問一下行為樹跟機器學習中的決策樹的差別是什麼?去網路上查一下行為樹好像很少除了遊戲領域以外的運用,是因為他本質就是決策樹,還是有其他原因呢?剛開始學ai還有很多不懂請各位大神幫忙解惑了
2021-05-12 00:01:20
靈巧
決策樹只靠“判斷”,所以它節點答案是單一的,故每個節點下必須有全部的答案給決策樹去走。

行為樹判斷是靠“優先級”,它一個節點下可能有一狗票都符合條件,而他只取優先度高的做。

舉例的話:決策樹節點只會有"是、否、可能",行為樹則會有"是1、是2、是3、是4、否、是5" 然後"是1"排序最高就選"是1"

不知道這樣是否有回答到你的問題呢?
2021-05-12 13:51:31
Xmichael_
嗯嗯了解了感謝說明
2021-05-14 12:08:28
追蹤 創作集

作者相關創作

相關創作

更多創作