上一篇提到嘗試 Behavior Tree,經過一個禮拜的努力。
我覺得對它的了解增加了不少。底下一樣是紀錄和感想。
使用素材
上禮拜小試身手後,準備要開始製作遊戲。
我喜歡從外觀去聯想,所以我先去找遊戲要用的美術素材。
不過還是以簡單能用就好為主,不需要花太多時間。
Behavior Tree (以下叫行為樹)
首先來一點前情提要。基本概念和用法參考的影片是底下這部,後半我會推薦另一篇文章。
做出了第一版,牛會閒晃和吃草。
底下是做出來的行為樹結構,看起來很複雜。
李組長眉頭一皺,發覺結構應該有問題。
沒錯,我做完也發現太複雜了。AI 只是執行簡單的閒晃、吃草。
行為樹作為工具應該是把問題變簡單,而不是變得更複雜。
所以我認為一定是哪裡有問題,開始找更多參考資料。
雖然我只看了前面幾回,不過我對於行為樹概念有再多了解一些。
但是對於怎麼做,還是有點抓不到感覺。
因為他是舉遊戲裡的具體例子,比較好想像和理解。
加上前面的實際練習的經驗。讓我開始抓到一些感覺。
補充:
我現在看英文文章都是直接網頁翻譯,看到奇怪的名詞、句子,再切回英文版本了解原意。
雖然可能有些不精確的地方,不過這樣省了我蠻多力氣、時間。
先放上我修正後的情況。
牛的動作是跟第一版差不多,甚至好了一點。
接下來就是重點的結構了。可以對照上面,簡化了很多。
重新思考動作
先不去想額外的條件,只保留最基本的動作。
問號是SelectorComposite,右箭頭是SequenceComposite。
吃到草 |
Selector -> 吃草(成功) -> Selector(成功)
|
沒吃到草 |
Selector -> 吃草(失敗) -> Selector -> Sequence -> 尋找草叢(成功) -> 移動(成功) -> Sequence(成功) -> Selector(成功)
|
簡單來說就是牛如果沒吃到草,它會嘗試下個動作。
這裡的下個動作是尋找草並往草移動。
測試正常之後,我才開始延伸。
另外根據我第一版的經驗。
原本我想說Godot的節點樹,看著那個想像行為樹的結構應該還可以。
但我發現不行,太自虐了。非常容易眼花。
我會推薦直接用你習慣的工具,我會拿紙筆直接畫出結構。
然後回頭看著那張圖,開始照著設計圖做行為樹。
底下是我後來才做的示意圖。
圖裡有一些沒提到的名詞,可以去看我提到的資料,都有更詳細的解說。
這裡我就不多說了。
示意圖
看著這張圖,我比較好想像我的樹建到哪裡。
一邊做一邊想,會做到亂掉,不知道自己在做什麼。
AI 大概的流程。
牛肚子餓就開始吃草叢,沒得吃就尋找草叢,往它的位置移動。
然後再確認一次肚子餓不餓,餓就繼續吃。不餓了就隨便決定一個方向移動,然後吃草。
動畫處理
還有從上面的影片可以看到,牛移動會播走路動畫,吃草會撥放低頭吃的動畫。
這裡我用了FinteStateMachine。
最開始我是嘗試直接在行為樹裡,直接呼叫播放動畫。
可能因為它不是連續執行的,沒辦法判斷動畫接續,會變成只播動畫第一幀。
所以我開始思考替代方案,想到FinteStateMachine。
第一次嘗試用其他東西去控制FinteStateMachine,
首先我想到的方法是行為樹會把現在動作對應的State存到變數。
然後StateMachine裡的process,會不斷確認跟現在的State一樣嗎,不一樣就切換State。
這樣也有達到切換State的效果。
但我是覺得這樣處理還不是很漂亮。
從網路上看有沒有什麼提示可以參考。
最後看到一個方法。以腳色本身的變化,去改變State。
以牛來說,我現在只關注它的速度。
只要是零向量也就是牛停下來了,那它會切換到吃草的State;反之有任何速度,切換到移動的State。
這樣兩個系統就是分開的,兩邊不會互相影響。
結論
我推薦一邊對照網路上的資料,不懂的地方就實際去測試看看。
總會慢慢抓到一些感覺,抓到感覺回頭看這些資料,又會有新的體悟。
這是一個良性循環。
以上是我這半路出家土法煉鋼想出的解法。
歡迎分享更多好方法。
最後一樣簡單的宣傳公會和群組。
Godot 開拓者交流互助公會
無論是新手還是有經驗的 Godot 使用者,都歡迎你的參與。
參考資料
行為樹概念、Beehave操作