メインコンテンツまでスキップ
バージョン: 1.1.0

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 モジュールによって提供されています。 任意の名前のグローバル変数を格納することでツリー内のどこからでもアクセスでき、ノード間のデータ共有を実現します。