1 瞭解行爲樹
首先製作AI有很多種決策方式,比如 有限狀態機(Finite-State Machines),分層狀態機(Hierarchical Finite-State Machines),行爲樹(Behavior Trees),效用系統(Utility Systems),目標導向型行動計劃(Goal-Oriented Action Planners),分層任務網絡(Hierarchical Task Networks) ,不同的決策方式針對不同的遊戲行爲,各有優缺點,可以擇優選擇,我們爲什麼要選擇行爲樹呢?行爲樹中的可擴展性是最優的,且靈活性可以適應任何不同的AI情況,其隨機性非常可視化判斷與調試,但是行爲樹顯而易見也有部分缺點,比如大量判斷耗時,且不一定是最優決策選擇。
2 走進行爲樹
行爲樹的每一個葉子 我們都稱爲節點,通過一個個節點來搭建一個樹結構,即數據結構的樹結構。通過樹結構的中序遍歷來將所有節點串聯在一起。其中沒有下一個節點的稱爲 子節點,有下一個節點的 稱爲父節點。
子節點 又分爲 行爲節點、條件節點。 父節點 分爲 裝飾節點、組合節點。其中在Unreal Engine中 條件節點被結合在 裝飾節點中。
通過這四種節點的不同排列組合 構建成了一顆行爲樹。
3 搭建行爲樹(基於unity的Behavior Designer行爲樹插件)
每一顆行爲樹都是從根節點開始
接下來要新建一個父節點,我們一般新建一個組合結點中的順序節點,要行爲樹從子節點按從左到右執行。比如:
接下來只要搭配子節點就完成了 一個簡單的行爲樹
這裏有一個父順序節點,一個條件節點一個動作節點 共同構成一個子節點。這裏表示滿足條件節點的條件就執行該動作節點的動作。
4 編寫節點
4.1 編寫父節點
編寫裝飾節點 需要繼承Decorator 重寫CanExecute 來判斷子節點是否成功與失敗 重寫Decorate來判斷自己是否返回成功與失敗 例如:
編寫組合節點 需要繼承Composite 組合節點比較複雜,大體需要控制所有子節點的返回來確定自己的成功失敗返回值,通過重寫OnChildStarted(int childIndex) 來返回子節點編號,
重寫CanExecute()來判斷子節點是否成功與失敗來繼續執行下一個節點,重寫OverrideStatus來判斷自己是否返回成功與失敗 例如:
編寫子節點
編寫條件節點 需要繼承Conditional 只要重寫OnUpdate 來判斷條件,選擇返回值即可 比如:
編寫行爲節點 需要繼承Action 只要重寫OnUpdate 來執行行爲,選擇返回值即可 比如:
後續繼續學習就看下章