轉自:http://www.cnblogs.com/konlil/archive/2011/04/23/2025954.html
如果要讓游戲里的角色或者NPC能執行預設的AI邏輯,最簡單的用IF..ELSE...神器既可以實現,但是再復雜的一般用經典的狀態機來切換狀態,但是編輯器寫起來比較麻煩。相對的,行為樹(Behavior Tree)理解和編輯起來就非常簡單了。行為樹,其實也是一種有限狀態機,只不過形式上分層呈樹結構,人稱分層有限狀態機(HFSM)。
行為樹主要用四種節點(還有諸如:裝飾節點等其他能更豐富功能的節點)來描述行為邏輯,順序節點、選擇節點、條件節點、執行節點。每一棵行為樹表示一個AI邏輯,要執行這個AI邏輯,需要從根節點開始遍歷執行整棵樹;遍歷執行的過程中,父節點根據其自身類別選擇需要執行的子節點並執行之,子節點執行完后將執行結果返回給父節點。節點從結構上分為兩類:組合節點、葉節點,所謂組合節點就是出度大於0的節點,葉節點一般用來放置執行邏輯和條件判斷。
--順序節點(Sequence):組合節點,順序執行子節點,只要碰到一個子節點返回FALSE,則返回FALSE;否則返回TRUE。
--選擇節點(Selector):組合節點,順序執行子節點,只要碰到一個子節點返回TRUE,則返回TRUE;否則返回FALSE。
--條件節點(Condition):葉節點,執行條件判斷,返回判斷結果。
--執行節點(Action):葉節點,執行設定的動作,一般返回TRUE。
比如:我們要表達一個最簡單的NPC AI :
行為樹的結構如下(其中黃色的是裝飾節點,這里當做CD定時器來處理,在CD時間內這個節點一直返回FALSE,否則返回TRUE):
設計好這個圖,實現時將其轉化為xml或者lua table或者json或者其他層次化的表示供程序讀入,並構建好樹對象,整個執行流程偽代碼可能是這樣的:
bt = btreee:new()
bt. load ( " test.xml " )
end
function gameBrain.update()
bt.execute()
end
function main_cycle()
-- ...
brain.update()
-- ...
end
-------------------------------
有了這樣一顆行為樹,如果我們改變Condition的條件及兩個不同的Action的具體操作,就可以實現各種各樣的IF...ELSE...的AI邏輯;你可能說這簡直就是簡單問題復雜化;對於上邊的這個邏輯的確是這樣。但是行為樹的優勢在於其可以用層次化的方式表述AI,甚至可以用很簡單的圖形化的方式來編輯AI,而不需要改動AI框架代碼。實施的時候,可以策划設計好行為樹結構,程序填寫Condition和Action即可;甚至可以做到代碼完全不動,程序預先寫好各種不同的Condition和Action供策划選用即可。