Behavior Designer行為樹打斷機制筆記
個人理解,理解不當之處歡迎指教。
Abort Self:
自我打斷:
will reevaluate when any task within the current branch is active.
直觀解釋:
條件變化時,主動讓出執行權。
打斷條件:
1. 當前分支(設定自我打斷的組合節點所處分支)處於Running狀態。
2. 條件節點是當前組合節點的直接子節點(不包括孫子節點)。
3. 條件節點優先順序比Running分支的優先順序高。
4. 條件節點的狀態發生變化。
例如上圖,當 Int Comparison 這個條件節點滿足條件時,將會執行Wait節點。
某一時刻,Int Comparison 這個條件節點變為不滿足時,則會打斷Wait節點,去執行Log節點。
Abort Lower Priority:
打斷比我優先順序低的分支:
will reevaluate when any task to the right of the current branch is active.
直觀解釋:
條件變化時,從低優先順序的分支搶奪執行權。
打斷條件:
- 當前組合節點(設定打斷的組合節點)沒有在Running狀態,且已經執行結束。
- 比當前組合節點低優先順序的兄弟節點所在的分支處於Running狀態,也就是說當前組合節點的父節點處於Running狀態。
- 條件節點是當前組合節點的直接子節點(不包括孫子節點)。
- 條件節點處於執行路徑上。例如父節點為selector節點,只會重新評估到第一個成功的條件節點為止的節點序列。
- 條件節點的狀態發生變化。
- 設定低優先順序打斷的組合節點可以巢狀。用來將孫子輩的節點加入重新評估列表。但是巢狀不能斷層。
例如上圖:
- 三個條件節點中,條件節點2或條件節點3的狀態發生變化時會進行重新評估,有可能打斷Wait節點的執行狀態。
- 注意選擇節點2和選擇節點3,外加順序節點1都必須設定打斷低優先順序,條件節點2和條件節點3才會納入重新評估列表。
- 由於選擇節點1沒有設定打斷,所以條件節點1不納入重新評估列表。
- 如果一開始條件節點2為成功狀態,由於Selector的短路操作,條件節點3不會納入重新評估列表。
待重新評估條件節點列表節點範圍:
1. 首先確定Running分支路徑(以上圖片綠色節點所組成的路徑)。
2. 自我打斷:
如果Running分支路徑上的組合節點設定了自我打斷。則該組合節點的直接子節點中的所有高優先順序條件節點納入重新評估節點列表。
3. 打斷低優先順序:
如果組合節點設定了打斷低優先順序,且不在Running狀態,其父節點在Running狀態,也就是說低優先順序的兄弟節點在Running狀態。
①則該組合節點子節點中的已評估條件節點納入重新評估節點列表。
②如果該組合節點的子節點中的已評估的節點為組合節點,且設定了打斷低優先順序,則該子節點的子節點(孫子節點)中的已評估條件節點納入重新評估節點列表。該方式可以無限巢狀。
行為樹執行過程中,待重新評估列表生成規則:
1. Tick一顆行為樹為先序遍歷。
2. 需要待重新評估的子節點儲存在父組合節點的待重新評估列表中(包括組合節點和條件節點)。
3. 待評估節點列表生成規則入下:
組合節點執行子節點的過程中:
1. 組合節點執行時,將執行路徑中的【子組合節點】加入待重新評估列表。
2. 設定了【下打斷/全打斷】的【組合節點】執行時, 將將執行路徑中的【子條件節點】加入待重新評估列表。
組合節點執行完畢時:
1. 不打斷,下打斷
沒當前組合節點所在分支子樹什麼事了,需要清空本分支所在子樹的所有待評估列表。
具體步驟:
1. 將子樹中設定了【右打斷/全打斷】的【組合節點】的評估列表清空。
遍歷過程中,如果遇到沒有設定右打斷的組合節點,則不再繼續清理該組合節點所在分支的子樹。
2. 清空當前組合節點的待重新評估列表。
2. 右打斷
將執行路徑中的【子條件節點】加入待評估列表。
3. 全打斷 ( Abort Self | Abort Lower Priority )
不執行操作。