行爲樹(BehaviorDesigner)插件(1)--認識行爲樹

遊戲中的AI,大多數都是按照規則設定好的,沒有太多花哨的技術。原因有幾個:

一是出於風險成本的考慮,用一個新技術,需要程序員開發相應的算法和框架,遊戲設計師重新上手設計方法和摸索算法的適用範圍,小團隊承受不起這樣的開銷,大團隊又怕做壞名聲;

二是“高級”的AI算法並不直觀,難以設計。舉一個例子,怎麼利用神經網絡來訓練一個士兵AI?我見過的一個例子是設計師用幾個按鍵來操作士兵移動攻擊,然後程序自動記錄敵我雙方的數據和設計師的操作,最後利用這些信息作爲input構建一個行爲樹。這個方法的問題有三個,一是效率奇慢,因爲如果數據不夠,行爲樹就可能覆蓋不了所有情況,但多少纔是“夠”,又沒有定論;二是錯誤的操作也會被記錄下來,當然可以開發一個功能來刪除設計師的某個動作;三是行爲樹的結果是無法解釋的,相當於一個黑箱。

 

 

由於上述的原因,一般的公司都會使用比較傳統的有限狀態機。

雖然第一次聽的話可能會拗口,其實有限狀態機的意思其實很簡單,它包含了有限個的狀態和狀態間的轉換條件。最直白的說法就是幾個if...else...語句。爲了弄明白這個概念,我們講一個英雄的故事:

從前有一個膽小如鼠的英雄,

  1. 他看到哥布林就會跑過去打它;
  2. 他看到半獸人就會逃跑;
  3. 他看不到哥布林也看不到半獸人就會休息;
  4. 他看到哥布林也看到半獸人也會跑。

我們可以從中抽象出這樣的一個有限狀態機:

 

有限狀態機很符合我們的認知,但它有一個致命的缺點——它隨着狀態和轉換條件的增多而急速地變得錯綜複雜,以至於很難對它做出改動(想象一下,多加一個狀態,則需要增加幾條轉換線,越多狀態,需要增加的轉換線越多)。

 

也由於這個原因,比較多的開發者投入了行爲樹的懷抱。

 

行爲樹

定義

行爲樹的概念會比狀態機要複雜些——行爲樹是一個包含邏輯節點和行爲節點的樹結構,每次需要找出一個行爲的時候,會從樹的根節點出發,遍歷各個節點,找出第一個和當前數據相符合的行爲。行爲樹的執行順序爲從左到右,並且按深度優先的順序。

很拗口對吧,下面來一個生動點的解釋,繼續上面的英雄的故事,但是是用行爲樹表達出來:

這個行爲樹是等價於之前的有限狀態機的。其中

Root是根節點,每次需要尋找行爲的時候都必須從這裏開始。

Priority Selector是一個邏輯節點,它的意思是讓從左到右遍歷自己的子節點,如果子節點的准入條件符合信息的話,就執行該子節點。如果英雄只看到哥布林,那麼Orc in sight這個准入條件不符合,Escape不執行;Globlin in sight符合,於是執行Fight;因爲Fight在Idle的左邊,所以Fight的優先程度更高,於是Idle不執行。在我們的例子中,Idle可以看作是default behavior。

優點

從簡單的行爲樹和有限狀態機的對比,我們就可以看出,行爲樹由於引入了邏輯節點,它的轉換條件更加少(線更少,更清晰),讓拓展AI變得更加容易

行爲樹還有另外一個優點:行爲的重用(reuse)。

例如,Escape有一個跑的行爲,而Fight則有跑的行爲,和砍怪的行爲。請看圖:

 

Sequence同樣是一個邏輯節點,它的意思是從左到右按順序執行子節點,並且僅僅在一個子節點執行完成後才執行下一個子節點。在例子中,Do Run需要有一個自己判斷到達目的地的方法,當該方法返回end的時候,纔會執行Do Slash。

Escape和Fight的Do Run行爲節點是一樣的,只是Fight多了一個Do Slash行爲節點而已。所以Do Run是一個可以重用的節點。

在行爲樹中,我們能夠編寫好Do Run,Do Slash這些基礎的行爲節點,和設定一些准入條件,就可以組成千變萬化的AI了!

我們希望英雄在逃跑的時候羣衆發出噓聲,而在攻擊的時候出現歡呼聲:

 

省略了其他部分,只畫Escape部分。

Parallel是一個邏輯節點,它的意思是讓所有子節點同時運行,那它什麼時候結束呢,可以使當所有子節點都完成的時候結束,也可以讓任一子節點完成時結束,根據需要來做出選擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章