用行为树的方式思考:任务系统设计
行為樹從本質上來說,是一顆邏輯樹,它把所有的行為邏輯用樹形結構串聯起來,仔細觀察的話,可以發現行為樹的核心思想有三個方面:
?
- 邏輯分離
- 邏輯關聯
- 邏輯抽象
聽上去很玄乎,其實是很簡單的東西,可以先想想我們平時要做一個功能是怎么做的,我們會先定義一個函數,定義好輸入和輸出,然后在這個函數里寫代碼來實現功能邏輯,這是第一步,是最直接和簡單的方式。后來,當這個功能越來越復雜的時候,這個函數里的代碼就會越來越長,變得難以閱讀和維護,我們就會把一些邏輯拿出去,變成另一個函數,原先那個函數里就變成了一些簡單邏輯和函數的組合,再然后,我們發現有些函數可以變成一些通用函數,我們就會把這些函數集合起來變成一個庫,這樣其他的函數也可以訪問這個函數來獲取他的邏輯功能。
這里的整個過程就包含了上面所說的三個方面,把邏輯移出去變成一個新的函數,就是“邏輯分離”,原本函數里的簡單邏輯和函數組合就是“邏輯關聯”,把函數變成通用庫就是“邏輯抽象”。AI是游戲的邏輯大戶,充斥著大量的游戲邏輯和算法,所以就特別需要好的架構來維護和管理“邏輯”,要不整個代碼就是一團糟,不僅無法維護,而且也很難除錯,現有的AI的架構基本都圍繞這個展開。
讓我用有限狀態機(FSM)來舉個例子,在FSM中就包含了邏輯的分離和抽象,它有“狀態”這個概念,這就是一個邏輯塊,它的邏輯塊也可以重用,但它對于邏輯的關聯做的相對比較薄弱,由狀態自己來決定何時跳轉,并且跳轉比較隨意,所以邏輯的關聯性比較模糊,這就導致FSM在多狀態的情況下很難維護。所以后來有了層次化的有限狀態機(HFSM),部分解決了邏輯關聯模糊的問題,但FSM的設計原理導致它并沒有辦法從根本上解決問題。但對于狀態和跳轉都不是很復雜的功能,FSM是個不錯的選擇。
讓我們再回到行為樹,行為樹把邏輯分散在節點中,每個節點負責自己的邏輯部分,這些邏輯節點又可以被放在行為樹的其他部分,也就是可以被重用。在這個基礎上,行為樹又抽象了三個邏輯概念,控制邏輯,前提邏輯,行為邏輯,其中行為邏輯用來描述功能,控制邏輯和前提邏輯用來描述邏輯間的關聯,對于邏輯關聯的抽象是行為樹相較于FSM的一個重大突破,它使得邏輯的關聯“可視化”了,用過行為樹的人都會有這樣的感覺,我只要看一下樹的結構,我就能知道整個AI行為是如何協作的了,也正是這樣的優勢使得行為樹現在被越來越多的用在了AI邏輯中。
但如果我們再往前思考一步,QQ賬號出售可以發現如果僅僅把行為樹限制在AI部分,顯得有點可惜,就像我前面一直強調,行為樹就是邏輯樹,是一種對于邏輯的維護和管理的架構。游戲中很多地方都是有邏輯的,有些甚至會非常復雜,這些地方為什么不能用行為樹的方式來思考和實現呢?經過實踐,我發現這是完完全全可行的,我甚至可以這樣說,只要存在復雜的邏輯,就可以用行為樹的方式去做,它可以很好的幫助你理清思路,實現漂亮的邏輯代碼。由于行為樹與AI有了“密切”的綁定,所以甚少接觸AI的程序員對行為樹基本不是很了解,這也導致行為樹并沒有得到廣泛的應用,甚至都沒有作為一個候選方案。
我有幸在現在項目里,做了很多其他的模塊,所以我也把行為樹的一些思路用到了其他的模塊中,發現寫起來非常的順,也很爽快。我舉一個我們在項目中碰到的例子,就是任務系統,做過游戲的人都知道,這個系統在邏輯層面是很復雜的,內容繁多,但如果用行為樹的方式去思考的話,就會發現這個復雜的問題一下子就簡化了。
仔細分析任務系統的話,可以把任務系統分成幾個部分,一個是接這個任務條件,然后是任務的完成目標,然后是獎勵(這個和下面的討論關系不大,暫且略過)。我們先可以抽象兩個概念,“單個條件”和“單個目標”。單個的條件包含“怎么算是達到條件”的一段邏輯,單個的目標也是一段邏輯,包含了“怎么算是完成”。所以這些都可以做成一個個邏輯單元,就像行為樹的前提和行為節點一樣。另外根據設計的需求,接任務的條件可能有多個,完成的目標也可以有多個,所以這些單個邏輯之間就存在邏輯關聯,所以我們可以借鑒行為樹中控制節點的概念,把這些邏輯關聯也抽象出來,成為“關聯”,比如一個最簡單的邏輯關聯就是“并且”,這樣我們就可以描述這樣一個邏輯,要完成目標1,“并且”完成目標2,這里我們就把兩個“單個目標邏輯”用“關聯”串起來了。
最后,我們就在每個任務中定義了兩顆邏輯樹(換個通用的名稱,其本質和行為樹是一樣的),一個是接這個任務的條件樹,一個是完成這個任務的目標樹,這樣每個任務都可以用配置文件來配,我們也做了一個工具來幫助設計師來生成和編輯任務,作為程序只要維護那些可以被用到的“條件”,“目標”,“關聯”就可以了。
任務系統設計
關于任務系統,我這里就貼幾個代碼片段(偽代碼)再詳細說明一下
先是數據結構定義:
由于Condition和Objective都定義成了樹結構,所以我們就可以很方便的組織邏輯,下面是一個具體Condition的例子,Objective也可用同樣的方式定義出來。
?
這樣接任務和更新任務就變的很簡單。
?
所以我們只需要定義出單個的邏輯片段,然后游戲設計去拼搭任務邏輯就可以了,和行為樹的思路是很像很像的。當然任務系統還有很多細節需要處理,但這樣的邏輯結構可以大大的幫助理清思路,實現出漂亮的代碼。
Mission Complete!非常簡單!
這就是行為樹的思維方式帶來的好處,我們在游戲的教程系統,技能系統等相對邏輯復雜的系統中都或多或少有用到這樣的架構方式,使得單個的邏輯被高度提煉和抽象,邏輯的關系非常清晰,分工也變得更為簡單。
總結
以上是生活随笔為你收集整理的用行为树的方式思考:任务系统设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《聚爆Implosion》性能精析:这是
- 下一篇: ARPG手游性能分析报告:加载、GC、内