我們現在做的遊戲,包括手遊,網頁遊戲,ai部分策劃那邊的需求並不複雜(待機,巡邏,行走,逃跑,攻擊,被擊),而且ai需求定了,也不會有太大的改動。所以用狀態機是乙個不錯的選擇,因為狀態機確實很簡單(我們一直都是用狀態機)。行為樹,實現ai的另外一種方式,先簡單介紹一下行為樹的概念,然後我們用行為樹的方式實現一套簡單的ai。
行為樹,從名字看肯定是一種樹形結構,樹的結點可以分為葉子結點和非葉子結點。在行為樹中非葉子結點 負責控制ai的邏輯走向,叫做控制結點,葉子結點負責執行邏輯。
控制結點又可以分為以下幾種型別:
root:根結點,沒有具體的意思,每次計算ai的邏輯需要從它開始, 逐個遍歷子結點。
selectnode: 選擇結點,有乙個子節點返回true,分支就結束,不再遍歷。
sequecenode: 序列結點,有乙個子節點返回false,分支就結束,不在遍歷。
parallelnode: 並行結點,子節點可以在同一幀中都執行,返回結果由子節點的邏輯決定。
葉子結點分為:
conditionnode: 條件結點,是actionnode的前置條件。
actionnode: 執行結點,執行具體的邏輯,比如行走,攻擊。
以上是我個人對行為樹的理解,肯定又不合適的地方,歡迎指正。
策劃同學的需求:小明養了乙隻兔子,兔子在草地上吃草,有乙隻狼要吃兔子,如果離兔子比較遠,狼會慢慢的趴著走,如果走近了狼會衝刺過去,兔子看到狼接近了會停止吃草
向小明跑過去。小明如果看到兔子跑到距離自己一點範圍會給他乙個胡蘿蔔,如果看到狼靠近了小明就得趕走狼。等狼趕走了,兔子又去吃草,整個過程需求就這樣迴圈。
我們先分析以下這段需求,行為樹結點怎麼設計,很顯然有3個物體需要有ai,小明,兔子,狼,它們3個的ai也是不同的, 我們分別畫出它們對應的樹形圖, 然後對應圖來說明。
從兔子開始,他的ai最簡單,它有2種行為:吃草、逃跑。當狼靠近了時他就往小明跑,所以逃跑需要乙個前提條件,狼靠近了,我們用aicondition_1來處理,這個類負責處理兔子的預警。兔子的圖:
接下來是小明的ai,小明有3種狀態,待機,喂兔子,驅趕狼。
待機:這個簡單就是個動作,所以是行為結點。
喂兔子:這個需要條件(兔子靠近了),所以這個點就做成選擇結點,它下面有2個子節點乙個條件結點,乙個行為結點
驅趕狼:這也是乙個選擇結點,它下面有2個子結點,乙個是條件結點,乙個是行為結點
最後是狼,描述它的這棵樹要複雜些。看圖
不一樣的地方是狼的行為中定義了乙個並行結點searchrobbitnode, 它下面有2個行為結點,observeaction和moveaction,上面的observeaction應該是紅色的,它是個行為點。狼找兔子要一邊看,一邊走,眼睛和腿同時運動。其他的結點都比較簡單,都是乙個條件配上乙個行為,然後它們的父結點是乙個選擇結點。
以上就是我對這個需求的簡單分析說明。下面說一下主要的**:
xiaoming,robbit,wolf 分別代表小明,兔子和狼,他們的乙個重要屬性agent,是管理ai的類。
agent裡面有所以的ai,如果物體需要某種型別的ai(idle,move,attack...),實現相應的介面就行。
control這個包裡的是主要的**,雖然很簡單,但是它是整個樹的控制模組。
**放入附件裡,沒有寫完,小明的攻擊ai沒有實現,呵呵,我有點懶。如果對大家有所幫助,就好,有在生產環境中用過行為樹的同學,歡迎賜教。
AI之用行為樹來實現邏輯
行為樹是一種在遊戲中常用的實現ai的方式,通過行為樹可行圖形化實現常用的程式結構。每次執行ai時,從根節點 root 或running節點開始遍歷,父節點執行子節點,子節點執行完後將結果返回父節點,父節點根據子節點的結果來決定接下來怎麼做。行為樹的執行過程就是查詢要執行的葉子節點的過程,查詢的依據就...
AI中的行為系統
內容都來自於此 這裡只是裡面的文章做了乙個總結 目錄 1.命令佇列 行為層實現方式 2.行為樹 決策層實現方式 節點分類 行為樹節點的特性 控制節點 行為節點 行為樹的輸入和輸出以及共享資料 外部前提的實現 ai系統的請求層 ai中的行為系統就是根據收集到的資訊和特定的輸入,經過乙個決策過程,做出具...
遊戲AI 個體AI角色的操控行為 1
1.靠近 建立乙個類steeringforseek繼承steering,將目標物體拖入target,我們的ai就會自動向target靠近。重寫其中的force方法 在vehicle中會遍歷所有的steering的子類,我們實現的靠近類重寫的force就會被加入vehicle的力中來實現物體的移動 p...