在遊戲AI裡除了狀態機(Finite State Machine, FSM)的概念外,其實有著許多不多的分類,像是以對應規則的(Rule Base)、模糊邏輯AI(Fuzzy Logic AI)、遺傳演算法(Genetic Algorithm)、行為樹(Behavior Tree, BT)、目標導向計劃(Goal Oriented Action Planning)
這次就針對行為樹做介紹。
不同於FSM的轉換狀態再執行相對應的動作,行為樹是利用邏輯和分類處理的方式進行篩選後再進行動作。這篇文章裡將BT解釋相當的透徹,我就不再贅述,但針對複合節點的應用,進行重點式記錄、註解。
常用的複合節點為
而Sequence的概念可用邏輯中的AND來理解,Selector則不意外的可用OR來理解。如文中的範例
Sequence則為依序的執行其動作,但這只是動作的事先規劃,也就是如果一切都按照設定來進行,至多也就是做到Close Door而後這個Sequence就會完整的結束。但中途如果走不到門,自然後面開門等動作不會執行。所以和AND一樣,可發生的會依序執行下去,直到某條件失敗則中斷。
Selector則是從第一個動作開始,如果第一個失敗,才會執行第二個,若是第一個就成功,則會中斷,不再往下執行下去。任何一個執行成功則會回傳成功,如果執行到最後一個動作,都還是失敗則會回傳失敗。
因為Selector的特性,所以安排動作時,會將優先順序高的放在前面,優先度低的則會放在後面。
文中提到的裝飾節點(Decorator)
Inverter概念就是邏輯中的NOT,直接將對的變錯的,錯的變對的。而Succeeder則是永遠是對的。Repeater對應的是程式邏輯中的WHILE迴圈,也可以加入次數如同FOR迴圈。Repeat Until Fail則是直到某條件回傳錯誤就中斷迴圈。
從這些節點的作用來看,和直接撰寫程式碼的邏輯概念很像,圖像化後行為樹也似乎是為了包裝艱澀的程式碼而生的產物,若是用Bolt的Flow Graph(FG)是否也有相同的效果?
雖然同為圖像化邏輯撰寫,但行為樹和FG存在本質上的差異。FG是沒有限制的圖,但行為樹之所以稱之為樹,是因為它用了Tree的結構,所以它的執行方向是被定義的。Tree的結構是由上到下,由左到右的方式執行。看似無關的順序卻是其脫穎而出的地方。
還記得在介紹Bolt時有提到Flow Graph算是圖像式邏輯中最低階的部份,而State Graph(SG)則是較高階的。行為樹和SG比起來,概念上層次又更高一些。也就是因為層次上較高,所以在行為賦予上,會更為簡潔,也就是可利用更少的節點進行,且節定之間的轉換已被定義在Tree的結構上,不用額外強調轉換和階層。
但這SG和行為樹只是概念層的定義上去決定動作怎麼呈現,任何行為若是以SG製作則可以用行為樹表示,反之亦然。但在行為樹的呈現上節點的使用看起來較為簡化而已。
Unity的環境裡提供了一套好用且持續更新的行為樹擴充-Behavior Designer。以下實際利用這一套工具來進行上述文章中的靠近門後一連串的行為模擬。
先將場景用NavMesh製作好,放上一些障礙物、門和NPC。
仿製文章中的行為,但礙於實際行動表現的複雜度,範例中的行為只用Console Log做文字上的呈現,且用機率決定該動作是否執行。
和多數的視覺化編輯工具相同,可以看到執行的狀態。於Unity編輯器中按下開始執行時會看到由上到下、由左到右的依次執行。特別的地方在於如果讓行為沒有被執行或是有錯,則以打叉符號呈現,若是成功則用打勾符號呈現,讓表現更直覺。此外,藉由顏色和註解讓圖更加清楚。
此簡易的行為樹可用4個狀態的狀態機來表現,這裡先省略,若有與趣的開發者可自行嘗試。
今日測試用的專案放罝在Git Repo中的behavior-tree-normal目錄裡。礙於Behavior Designer是付費擴充,不放置在專案中,請自行購入後引用。