對遊戲NPC的行爲控制一般有2種,一種是狀態機,一種是行爲樹。
狀態機:
Unity對人物動畫的控制是基於狀態機的,如下圖:
可以看到,每個狀態除了包含自身的狀態行爲外,還需要和其他的狀態打交道,需要輸入狀態機之間切換的條件。因爲這一點,導致增加狀態會使得狀態機越來越複雜。
狀態機是一種網狀結構,耦合性很大。
行爲樹:
1、行爲樹是將遊戲NPC的行爲(走動,攻擊,跳躍)搭建爲一顆樹,父節點是行爲分支,葉節點是行爲的具體表現。
2、行爲樹將NPC的行爲包裝爲一個對象,符合面向對象的設計理念。
3、行爲樹的好處是將行爲邏輯和狀態數據剝離,降低耦合,方便策劃配置,而無需對每個人物的行爲進行代碼控制,提高了可視性,簡化問題排查,提高效率。
4、行爲樹把行爲和狀態數據剝離,可以這麼理解,比如NPC要跳躍,那麼前提條件可以是:已完成上一個動作,HP大於0,下一個行爲狀態設置爲跳躍。把這些條件看作狀態數據,把跳躍的Animation看做行爲,那麼當要切換行爲的時候,就不用去管上一個狀態是什麼行爲、和上一個狀態是什麼關係。構建出來的行爲樹,只需要判斷當前的狀態數據是否滿足跳躍的條件,滿足就執行行爲,不滿足就返回false。
5、行爲樹是樹狀結構,相對於狀態機的網狀結構來說耦合性更低。
6、行爲樹的子節點執行時需要返回,返回類型有:False,True,Running。
7、行爲樹的父節點存在多個情況,1個節點和多個節點,當父節點有多個字節點時,有幾種組合順序:
①並行執行:並行執行多個子節點的行爲。
②隨機執行:從多個字節點中隨機選擇一個執行。
③選擇執行:從多個字節點中按照順序選擇一個能執行的行爲。
④順序執行:按照順序依次執行多個子節點。