Behavior Tree Maker システム概要
概要
Behavior Tree Maker (ビヘイビアツリーメイカー) は、チャットボットから呼ばれるエージェントの行動ルールを定義するビヘイビアツリーを作成するためのツールです。 ビヘイビアツリーにより、ゲームの操作を自動化し、指定した行動を実行するエージェントの行動ルールを定義します。 また、ビヘイビアツリーをカスタマイズすることもできます。
ビヘイビアツリーを構築することで、エージェントの迅速な応答を実現し、エージェントの自動化操作を実現します。
Playable! Game-Python Bridge を通じてインタラクションなゲーム操作を行い、エージェントの行動を制御することができます。
Playable! Map Scanner によって得られた地形情報を通じて、キャラクターの自由移動も実現できます。
ファイル構成
Behavior Tree Maker に関連するファイルは以下の通りです。
Python
├── b_t_maker.py ビヘイビアツリーメイカー本体
├── agent
│ ├── agent_collector
│ │ ├── action_nodes.py 実行ノードを構築
│ │ ├── formats.py ゲーム内情報を構築
│ │ ├── key_operations.py 基本操作を構築
│ │ ├── tree_structure.py ツリー構造を構築
│ │ └── trigger_nodes.py トリガーノードを構築
│ ├── agent_executor
│ │ ├── agent_thread.py エージェント実行
│ │ ├── astar_subprocess.py Astar探索
│ │ ├── dynamic_data_manager.py ゲーム内情報を更新
│ │ ├── tree_builder.py ツリーを実行
│ │ └── wrapper.py ゲームとの通信
│ ├── btm_prompts
│ │ ├── _base_prompts.py
│ │ ├── formats_prompts.py フォーマットのLLMプロンプト
│ │ ├── item_maker_prompts.py アイテムのLLMプロンプト
│ │ ├── item_selector_prompts.py アイテムのLLMプロンプト
│ │ └── key_operations_prompts.py 基本操作のLLMプロンプト
│ │ └── tree_structure_prompts.py ツリー構造のLLMプロンプト
│ └── agent_manager.py
├── user_interface
│ ├── btm
│ │ ├── action_nodes_view.py 実行ノードのUI関連
│ │ ├── format_view.py フォーマットのUI関連
│ │ ├── key_operations_view.py 基本操作のUI関連
│ │ ├── tree_structure_view.py ツリー構造のUI関連
│ │ └── trigger_nodes_view.py トリガーノードのUI関連
│ ├── _base_view.py
│ ...
├── data_manager
│ ├── _base_manager.py
│ ├── map_manager.py 地図情報を管理
│ └── static_data_manager.py 外部ゲーム情報を管理
├── data
│ ├── work_space ワークスペース
│ │ ├── command
│ │ │ ├── command_reference.tsv コマンドのリファレンス
│ │ │ ...
│ │ ├── map_data
│ │ │ ├── map_info.yml 地図情報
│ │ │ ...
│ │ ├── map_graph
│ │ │ ├── Astar_model.pyd Astar探索のc++クラス
│ │ │ ...
│ │ ├── object
│ │ │ ├── object_reference.tsv オブジェクトのリファレンス
│ │ │ ...
│ │ └── tree_items
│ │ ├── action_nodes.json 実行ノードのデータ
│ │ ├── formats.json フォーマットのデータ
│ │ ├── key_operations.json 基本操作のデータ
│ │ ├── tree_structure.json ツリー構造のデータ
│ │ └── trigger_nodes.json トリガーノードのデータ
│ ...
...
agent_collector
- さまざまな情報に基づいてビヘイビアツリー構造を構築し、エージェントとして出力します。
agent_executor
エージェントの実行に使用されるメインループプログラムです。
astar_subprocess.py
- 地図などのデータを読み取り、Astar 探索アルゴリズムの独立プロセスを提供します。
- 通信機能が含まれており、メインプロセスがリアルタイムに特定の場所に向かう具体的なルートを取得したり、特定の場所に行けるかどうかを確認できるようにします。
data_manager
- マップ、アイテム、NPC などの固定されたゲーム情報を管理します。
work_space
- ワークスペースは、エージェントの構築に必要なすべてのデータを含むフォルダです。
プログラム構成
用語説明
エージェント
ゲーム内のプレイヤーキャラクターの代理として、ゲームアプリと協調して行動するプログラムを指します。
ビヘイビアツリー
ビヘイビアツリーは、主にゲーム開発や AI プログラミングで使用される概念で、キャラクターが状況に応じてどのように行動するかを決定するためのツリー構造のフレームワーク、及び、それを記述したデータを指します。複雑な決定プロセスを単純化し、開発者がキャラクターの行動パターンを柔軟に設計するのに役立ちます。
本ツールはオープンソースライブラリ Py Trees のツリーの定義を踏襲しており、使用方法も基本的に一致しています。
ノード(Node)
ビヘイビアツリーの各要素はノードとして表されます。 ビヘイビアツリーの一部、もしくはビヘイビアツリーそのものと認識してください。 エージェントそのものもノードですし、ビヘイビアツリーに含まれているサブツリーのようなものもノードです。
ビヘイビアツリーは 1 フレームでルートノードから末端ノードに向かう経路をたどってノードを制御していきます。
子ノード(Child Node)/親ノード(Parent Node)
- 対象ノードの参照先ノードを「子ノード」、参照元ノードを「親ノード」と呼びます。
ルートノード(Root Node)
- ビヘイビアツリーの実行開始ノード。
- ビヘイビアツリーの最上位に位置して必ず一つだけ存在します。
末端ノード
- ビヘイビアツリーの最後のノード。
- ビヘイビアツリーの末端に位置します。
- 末端は全て アクションノード か トリガーノード になる必要があります。
ノードにはさまざまなタイプがあり、それぞれ異なる機能を持っています。
アクションノード(Action Node)
- 実際のアクションを表すノード。 キャラクターが取るべき具体的なアクション(例:移動、攻撃)がここに記述されます。
- 1 フレームで完了する、ゲーム固有の基本的なアクションを実行します。
- SUCCESS だけを返します。
- ツリーの末端に位置するノードです。
- 1 フレームで終わらない動作の場合は、繰り返し実行することで実現します。例えば、「目的地の方向に前進する」というアクションを繰り返し実行することで「歩く」が実現されます。
トリガーノード(Trigger Node)
- 特定の条件を評価するノード。 例えば、敵が視界内にいるかどうかをチェックするなどです。
- 事前に Python 実装しておいたトリガーを実行します。
- SUCCESS または FAILURE を判断条件によって返します。
- ツリーの末端に位置するノードです。
コンポジットノード(Composite Node)
子ノードを持ち、その実行ルートを制御するノード。
セレクターノード(Selector Node)
- 条件によって選択する子ノードを切り替えるノードです。
- いずれかが成功するまで、子ノードの動作を順に実行します。
- 複数の子ノードを持ち、子ノードの実行結果を参照します。
- 上から順に子ノードを実行し、子ノードが SUCCESS または RUNNING を返すと停止して子ノードの結果を返します。
- 全ての子ノードが FAILURE を返した場合は FAILURE を返します。
シーケンスノード(Sequence Node)
- 子ノードを順番に実行するノードです。
- いずれかが失敗するまで、子ノードの動作を順に実行します。
- 複数の子ノードを持ち、子ノードの実行結果を参照します。
- 上から順に子ノードを実行し、子ノードが FAILURE または RUNNING を返すと停止して、子ノードの結果を返します。
- 全ての子ノードが SUCCESS を返した場合は SUCCESS を返します。
- 失敗また全ての子ノードが成功するまで完了しないため、1 フレームで複数の子ノードを実行することがあります。 例えばトリガーとアクションを 1 フレームに実行する場合などです。
パラレルノード(parallel Node)
- 複数の子ノードを並列実行するノードです。
- 子ノードの動作を同時に実行します。
- 複数の子ノードを持ち、子ノードの実行結果を参照しません。
- 実行結果は無視して SUCCESS を返します。
- 必ず SUCCESS が返るので、できるだけアクションノードのみの親ノードとして使用してください。
デコレーターノード(Decorator Node)
条件や制限を追加するために使用されます。 これらは特定の子ノードがいつ実行されるかを制御するのに役立ちます。
反転ノード(Inverter Node)
- 子ノードの実行結果を反転するノードです。
- 1 つのみの子ノードを持ち、子ノードの実行結果を参照します。
- 子ノードが SUCCESS を返すと FAILURE を返し、FAILURE を返すと SUCCESS を返します。
カウントノード(Count Node)
- 子ノードを指定回数実行するノードです。
- 1 つのみの子ノードを持ち、子ノードの実行結果を参照します。
- 子ノードの指定する状態を計算し、指定回数実行すると設定された結果を返します。
- 子ノードの実行結果を反転するノードです。
blackboard
blackboard はデータを格納するための特別なクラスで、py_trees モジュールによって提供されています。 任意の名前のグローバル変数を格納することでツリー内のどこからでもアクセスでき、ノード間のデータ共有を実現します。