godot 行為樹
遊戲 AI 行為樹的 GDScript 實現,基於本機 Godot 節點並使用內建場景樹編輯器。
C# 版本 -> https://github.com/MadFlyFish/godot-behavior-tree-csharp
安裝
- 將“addons”資料夾複製到專案的主目錄中。
- 從專案設定啟用插件,然後重新啟動 Godot,否則它將無法識別新類別(這是引擎的錯誤)。
- 或者,您也可以將 bt_example 資料夾拖曳到專案的主目錄中。
- 若要查看範例的工作情況,請執行 agent.tscn 場景。 ex_behavior_tree.tscn 場景是如何建立樹的範例。
指示:
- 點擊節點建立圖示。您應該會看到新的節點可用(如果沒有,請重新啟動 Godot)。您必須使用 BehaviourTree 作為根節點,它應該只有一個子節點。此子節點可以是 BTNode 類別下的任何節點,它們都繼承自 BTNode 類別。
- 建立行為樹後,您必須指定 AI(代理程式)的擁有者以及正在使用的 Blackboard。黑板可以放在任何地方(假設它在樹外),甚至可以在不同的樹之間共享。該系統足夠靈活,可讓您決定如何以及何時更新黑板數據。例如,您可以使用處理更新黑板的腳本建立一個普通節點,例如。使用訊號回調,甚至在 process() 中。或者,您可以從其他任何地方進行操作,甚至可以從樹內部進行操作,只需確保以您可以維護和追蹤的方式進行設計即可。
- 行為樹流程執行其每個子級,這些子級會傳回某種成功或失敗狀態。只有成功節點之後的分支才會被執行。 BTNode 必須返回成功或失敗,並且只能透過yield() 呼叫來暫停執行,之後它將保持運行狀態直到執行完成。當 BTNode 處於運作狀態時,樹將逐漸暫停執行(唯一的例外是 BTParallel ),直到所有子節點完成執行。這是出於優化目的。
- 樹的流程由所謂的複合節點定義:BTSequence、BTSelector、BTRandomSelector、BTRandomSequence、BTParallel,它們都繼承自 BTComposite。如果所有子級都成功,則序列成功;如果其中一個子級失敗,則序列失敗。選擇器的邏輯相反,如果一個子級成功,則選擇器成功;如果所有子級都失敗,則選擇器失敗。並行將運行所有子級,並且無論如何都會成功,而無需等待子級完成執行。基本複合節點運行所有子節點並始終成功,但它也會等待執行完成。
- 你的AI行為的動作是在BTLeaf節點中進行的。新增 BTLeaf,然後執行「擴充腳本」。現在您可以透過重寫_tick()方法在此腳本中定義您自己的行為。你的行動將在這裡進行。請務必閱讀基本腳本中的註釋以了解最佳實踐。也要記住 BTLeaf 不應該有孩子。
- BTDecorator 用於自訂子節點的執行。他們只能生育一個孩子。
- BTCConditional 是最常見的裝飾器類型。新增 BTConditional 並擴展腳本,然後重寫 _ pre_tick()方法來定義子程序的執行條件。請務必閱讀評論,因為那裡有一個有用的範例。
- BTGuards 是可用於暫時鎖定分支的裝飾器。或者,您可以指派一個解鎖器,這將覆蓋指定的鎖定時間。也可以選擇分配儲物櫃。 BTGuard 可以使您的行為變得非常豐富、反應靈敏,並且經過優化,因為它們避免了不必要的分支和重複。
- 其他裝飾器允許您循環執行、反轉tick的結果等等。透過裝飾器自訂執行可以做很多事情。
- 好的做法是使用提供的節點並遵循行為樹的設計模式。但由於這是一個純粹基於程式碼的實現,沒有任何視覺化編輯器,因此您對設計有很大的控制權,因此有一定的誤差範圍。這些只是有用的腳本,遵循一些“良好實踐”,但如果沒有一些基本規則,則不受它們的約束。由您決定如何設計行為樹,但請記住,如果您誤用它,您將無法從行為樹模式的強大功能中受益。 (例如,您甚至可以將基本 BTNode 用於所有內容,然後每次都擴展它,儘管這會很混亂)
- 您可以擁有一個巨大的行為樹,但最佳實踐是遵循 Godot 的組件哲學,並為場景的每個組件製作幾個較小的行為樹。例如,你的運動控制器的一棵樹,你的武器控制器的一棵樹,你的探路者組件的一棵樹,等等。許多樹木使用,所以這是如果您想擁有幾棵樹而不同時製作多個黑板,那麼特別方便。就我個人而言,我之所以將黑板作為解耦組件,是因為我想讓敵人小隊共享相同的資料但行為獨立,所以這是一個用例。此外,我的演員中通常有多個組件,並且我想對不同的樹使用相同的資料庫。