Behavior Trees(行動木)とUnityでの実装について

人工知能技術 機械学習技術 自然言語処理技術 人工知能アルゴリズム ICT技術 デジタルトランスフォーメーション 人工生命 推論技術 知識工学 本ブログのナビ オートマトンと状態遷移と自動計画
Behavior Trees(動作ツリー)

Behavior Tree(動作ツリー)は、ゲームAIにも登場する複雑なAI行動を構築するためのフレームワークとなる。これはは元々ロボット工学を目的として開発されたものが、FPS等のゲームの中のノンプレイヤーキャラクター(NPC)のAIを設計する為の階層ステートマシーンの改良として用いられるようになったもので、利点として、設計と実装が容易で再利用性と移植性が高い為、大きく複雑なロジックに対応可能としたものにある。

ゲームAIの中では元来スーテトマシンが用いられてきた、ステートマシンは「有限個の状態と遷移と動作の組み合わせからなる数学的に抽象化されたふるまいのモデル」と定義されるもので、ある程度の規模のロジックを表現しようとすると、状態と遷移の組み合わせ爆発が起き、かつ再利用性が低いという課題を持つ。

これに対してBehavior Treeは、状態を相互にネストしてツリーのような構造を形成し、遷移をこれらのネストされた状態のみに制限することでモジュール性を高めている。

Behavior Treeの具体的な構造は以下に示すように、挙動(Behavior)を木構造またはDAGで記述し、ひとまとまりのタスクが部分木になっているものとなる。木を構成するための節(ノード)には、ルートノード、制御フローノード、リーフノード(タスクノード)の3種類がある。これらに対して評価を深さ優先探索で行い、探索した結果として子ノードから親ノードに情報が返ってくる。探索結果としては、Success(実行成功)、Failre(実行失敗)、Running(実行中)の3つがあり、すべてのノードには評価可能かを示すactive/iactive状態を設定できる。

wiki「Behavior tree」より

制御フローノードサブタスクを制御する為に用いられ、「セレクタノード」と「シーケンスノード」の2種類がある。セレクタノードは失敗しない最初の子を見つけて実行する為に利用される。Selector の子ノードのうちどれかが Success か Running を返した場合、Selector は即座に Success か Running を親ノードに返す。Selector のすべての子ノードがfailureを返した場合、Selector も failure を親ノードに返す。

これに対してシーケンスノードは子ノードを順番に実行する為のノードとなり、左から右(優先度が高い方から低い方)へ順に深さ優先探索で評価する。Sequence の子ノードのうちどれかが Failure か Running を返した場合、 Selector は即座に Failure か Running を親ノードに返し、Selector のすべての子ノードが Success を返した場合、Selector も Success を親ノード返す。

ここでセレクタ及びシーケンスノードはそれぞれ「ランダム」で動作するノードバリエーションを持ち、さらにifやwhile、loop等のシーケスを実行する為の「デコレータ」や、並行動作の為の「パラレル」ノードがある。

最終的なアクションは、一番末端のリーフノードに記述される。このリーフノードの記述はアクションとコンディションの2つに分けられる。アクションは、関数あるいはメソッドの実行となる。ゲームの例だとキャラクタを動かしたり、健康状態を低下させたりするものとなる。コンディションはゲーム世界のオブジェクトの状態を紹介するものとなる。例えばキャラクターの位置、体力の量になる。

ステートマシンでは状態の遷移を表している為、そこからのアクションを記述するにはもう一段ひつようだが、ビヘイビアツリーではそれらがストレートに記述される。

Unityを使ったunityを使ったbehavior tree

Unityでは、Behavior Tree(行動木)を実装するためのさまざまな方法がある。行動木は、ゲームキャラクターやAIエージェントの行動を制御するためのグラフベースのアルゴリズムであり、Unityには、行動木を作成するための専用のフレームワークやアセットもいくつかあるが、ここでは基本的な手法について述べる。

Unityで行動木を実装する一般的な手法は、スクリプトを使用してカスタムの行動木システムを作成する方法となる。以下に、この手法の基本的なステップを示す。

  1. ノードクラスの作成: 行動木は、ノードと呼ばれる小さなビヘイビアのブロックから構成される。Unityのスクリプトを使用して、ノードの基本的なクラスを作成する。ノードクラスには、実際の行動を実行するためのメソッドや子ノードへの参照などが含まれる。
  2. ノードの種類の作成: 行動木は、シーケンス、セレクタ、デコレータなど、さまざまな種類のノードで構成される。それぞれのノードには異なる振る舞いがある。これはたとえば、シーケンスノードは子ノードを順番に実行し、全てが成功した場合にのみ成功を返し、セレクタノードは子ノードを順番に実行し、最初に成功した場合に成功を返し、デコレータノードは子ノードの振る舞いを修飾する。これらのノードのクラスを作成し、必要に応じて追加のパラメータを持たせることもできる。
  3. 行動木の構築: 行動木を構築するには、ノードクラスを組み合わせて階層構造を作成する。親ノードは子ノードへの参照を持ち、必要に応じて条件や制御フローを設定することができる。
  4. 行動の実行: 作成した行動木を実行するためには、ルートノードを呼び出す必要がある。ルートノードは子ノードを順番に実行し、最終的な結果を返す。行動の実行は、通常、毎フレームのアップデートやイベントトリガに組み込まれる。

上記の手法を使用して、カスタムの行動木システムを実装することができる。ただし、Unityのアセットストアには、行動木を作成するための拡張機能やプラグインも多数あるで、必要に応じてそれらを活用することもできる。これにより、より効率的で視覚的な方法で行動木を作成および管理することができる。

行動木は、AIエージェントの複雑な振る舞いを制御するための強力な手法であり、Unityを使用して行動木を実装することで、ゲームキャラクターやAIキャラクターの振る舞いを柔軟に制御することができる。

unityのアセットストアを用いた行動木の実装について

Unityのアセットストアには、行動木を実装するためのさまざまなアセットがある。これらのアセットを使用することで、視覚的なエディタや事前に作成されたノードやブロックを活用して、簡単かつ効率的に行動木を作成できる。以下にいくつかの人気のあるアセットについて述べる。

  • Behavior Designer: Behavior Designerは、強力な行動木システムを提供するアセットとなる。このアセットには、ビジュアルなエディタが含まれており、ノードをドラッグ&ドロップして接続することで行動木を作成できる。また、条件やデコレータなど、多くのカスタムノードも提供されている。
  • NodeCanvas: NodeCanvasは、ビジュアルなエディタとカスタムノードを備えた行動木フレームワークとなる。このアセットには、行動木だけでなく、ステートマシンやダイアログツリーなど、他のAI制御手法も組み込むことができる。
  • Playmaker: Playmakerは、グラフベースのプレイメーカーシステムで、行動木を実装するための強力なツールとして利用できる。このアセットは、視覚的なステートマシンエディタを提供し、行動木の作成と制御を容易にする。

これらのアセットをUnityのアセットストアからダウンロードし、プロジェクトにインポートすると、ビジュアルエディタやカスタムノード、サンプルスクリプトなどが含まれている。これらのアセットを活用することで、視覚的で効率的な方法で行動木を作成し、AIキャラクターの振る舞いを制御できる。ただし、アセットストアのアセットを使用する場合は、ライセンス条件を確認することが重要となる。また、アセットの使用方法やドキュメンテーションを理解し、アセットの提供元からのサポートも利用できる場合があるので、それを活用することも検討すべきものとなる。

コメント

  1. […] Behavior Tree(動作ツリー) 概要 […]

  2. […] Behavior Trees(動作ツリー) […]

  3. […] Behavior Tree(行動木)とUnityでの実装  […]

タイトルとURLをコピーしました