一個游戲DEMO的AI部分
用到行為樹組件如上
主要說一下這兩個組件
一個裝飾(類似過濾器) 一個服務(代碼邏輯與Blackboard交互)
Service分為 大碰撞 和 小碰撞 兩個碰撞范圍, 大碰撞用來跟蹤, 小碰撞用來中斷跟蹤開始攻擊
IsTarget檢查
大碰撞
小碰撞
執行間隔
執行結果關鍵部分截取
看出問題了么?
我的角色在抽筋似的反復轉向
原因就是因為Service的執行時間是根據設置的那個間隔來的, 而跟行為樹的輪播調用沒有關系
行為樹開始新一輪執行,如果此時跟上一輪的間隔時間沒有到設置的時間,Service是不會執行的
但是如果行為樹執行到一半,Service的時間間隔到了,那么Service也是會立刻執行的
所以原代碼中, 我在Service里面直接修改了Blackboard的內容
恰好行為樹執行到一半, 讀取到我修改的值, 導致AI本來向player移動的, 變為了向NPC移動
然后因為我有player first原則, Blackboard的值又立刻變為了player, 導致AI在原地不停的轉向
改進后代碼 大碰撞
臨時變量用來存放循環時的值, 這樣在循環的時候不會更改黑板的值, MoveTo在取值的時候就不會被這邊的循環干擾
角色就不會在游戲中抽筋似的反復轉向