一、中斷類型
設置了中斷之后,行為樹會檢測執行過的子條件節點,當條件節點的狀態發生變化時,會中斷正在執行的Running節點,轉而立即執行該條件節點。
行為樹的打斷類型有4種:
- None
- Self
- Lower Priority
- Both
二、類型詳細介紹
(1)Self:打斷自己的直接子節點
- 當前分支處於Running狀態
- 必須是條件節點才能監聽狀態變化來打斷別人
- 條件節點的優先級必須比Running節點的優先級高(即在其左邊)
- 條件節點必須是當前組合節點(設置了打斷類型為self的節點)的直接子節點,孫子節點都不行
- 條件節點的狀態必須發生變化才能打斷。(這個好理解)
如上圖,當Selector設置了打斷類型為Self的時候,一開始檢測鍵盤某key沒有按下,於是執行 Wait。 當Wait還未結束的時候,這個時候如果按下了某key,那么【Is Key Down】節點會立即執行,隨后返回成功,Selector也返回成功。
(2) Lower Priority:打斷比自己優先級低的節點
- 當前組合節點(設置打斷的組合節點)沒有在Running狀態,且已經執行結束。
- 比當前組合節點低優先級的兄弟節點所在的分支處於Running狀態,也就是說當前組合節點的父節點處於Running狀態。
- 條件節點是當前組合節點的直接子節點(不包括孫子節點)。
- 條件節點處於執行路徑上。例如父節點為selector節點,只會重新評估到第一個成功的條件節點為止的節點序列。
- 條件節點的狀態發生變化。
- 設置低優先級打斷的組合節點可以嵌套。用來將孫子輩的節點加入重新評估列表。但是嵌套不能斷層。
上圖中,設置打斷類型為低優先級打斷。一開始未按下某鍵,執行Wait。 當按下某key之后,打斷了右側低優先級的key。
(有人會問,不是直接子節點才會檢測嗎,這個Inverter是取反,並不是條件節點。 我猜測他和Is Key Down組合起來,也是條件節點)
這種嵌套也是可以檢測按鍵按下,並中斷Wait的。
(3)Both:打斷兄弟和自己
Self和Low Priority的結合體。既會中斷兄弟節點中低優先級的節點,又會中斷自身孩子節點中的Running節點。
三、簡單小例子
設定:敵人一開始在發呆。當它看見玩家之后,會去追玩家。當玩家逃脫敵人視線之后,敵人恢復到發呆狀態。
此時的行為樹狀態:
如果這個時候,玩家向敵人移動,進入了敵人的視線。 條件判斷節點【AICanSeeObj】返回成功,則行為樹就會打斷節點【AIDaze】,轉而運行節點【AIMoveTo】。
敵人就會向玩家移動。
此時的行為樹狀態:
如果中斷類型僅僅設置為打斷低優先級,那么 行為樹會一直執行節點【AIMoveTo】。無論玩家是否逃出 了 敵人的視野范圍,都是一直這么執行下去。這樣顯然不符合游戲邏輯設計。
所以,還需將打斷類型增加個 打斷自己。這個時候,行為樹會檢測條件節點【AICanSeeObj】,玩家逃出敵人范圍之后,自動打斷節點【AIMoveTo】。
行為樹繼續執行節點【AIDaze】,敵人繼續發呆 (◎_◎;)
行為樹demo 項目:
https://pan.baidu.com/s/1I2IBtou4hsystzRAAr3gUw