AI ノード構造のビヘイビアツリーにおける Selector(セレクター)、Sequence(シーケンス)、Decorator(デコレーター)ノード
リサーチ

AI ノード構造のビヘイビアツリーにおける Selector(セレクター)、Sequence(シーケンス)、Decorator(デコレーター)ノード

著者GameDev Base
日付2026年10月20日
22分で読める

ゲーム開発におけるAIビヘイビアツリー:Unreal Engine 5およびUnityフレームワークにおけるセレクター、シーケンス、デコレーターノード構造の包括的分析

ビデオゲームにおけるAIシステムの進化は、純粋な決定論的ルールセットから、動的でモジュール化された、コンテキスト(文脈)を認識する意思決定メカニズムへと向かう、根本的なパラダイムシフトを反映しています。この進化の中心にあるのが、「ビヘイビアツリー(Behavior Trees - BT)」として知られる数学的および論理的な計画モデルです。元々はロボット工学や制御システム向けに開発され、特にロドニー・ブルックスの包摂アーキテクチャ(Subsumption Architecture)から着想を得たこれらの構造は、ゲーム業界において『Halo』、『Bioshock』、『Spore』といったハイプロファイルなプロジェクトを通じてその実力を証明してきました。1 今日では、Unreal Engine 5やUnityのような現代のゲームエンジンにおけるAIの主要な構成要素となっています。本レポートでは、ビヘイビアツリーの基本骨格を形成するセレクター(Selector)、シーケンス(Sequence)、デコレーター(Decorator)ノードについて、それらのノードの背後にある理論的論理、有限ステートマシン(FSM)に対する利点、数学的な動作メカニズム、そして現代のエンジンアーキテクチャにおける具体的な実装を包括的に検証します。

ビヘイビアツリーの理論的および数学的基礎

ビヘイビアツリーは、コンピュータサイエンス、ロボット工学、ビデオゲームにおいて計画の実行をモデル化する、有向かつ階層的な数学的ツリーモデルです。1 階層的なツリー構造上で設計されるこのモデルは、ルート(root)ノードから始まり、内部ノード(複合ノード)を経てリーフ(leaf/task)ノードへと進む実行フローを持っています。3 システムの最も基本的なアーキテクチャ上の特徴は、各ノードが自身の処理順序(tick)が回ってきた際に特定の論理処理を行い、その後、自身を呼び出した親ノードに対して特定の処理状態(status)を返すことです。3 この返される状態は、普遍的に3つの主要なカテゴリに分類されます:

  1. 成功(Success):ノードが定義されたタスクまたは論理制御を完全に実行し、完了したことを示します。3

  2. 失敗(Failure):ノードが定義されたタスクを実行できなかった、障害に遭遇した、または条件が満たされなかったことを示します。3

  3. 実行中(Running):タスクがまだ終了しておらず、継続中であり、次の処理サイクル(tick)で再評価される必要があることを示します。3

従来の決定木(Decision Trees)や単純なif-elseブロックとは異なり、「実行中(Running)」状態の存在により、ビヘイビアツリーは単一の処理サイクル(frame/tick)よりも長い時間、アクションを中断することなく実行でき、システムをフリーズから守るリアクティブ(反応的)な構造を実現します。5 ゲーム開発において、AIエージェントがA地点からB地点へ移動するには通常数秒かかります。このプロセス中、実行中のリーフノードは継続的に「実行中」状態を返し、親ノードが待機(Waiting)状態を維持できるようにします。4 この非同期的な動作により、エンジンのメイン処理パイプラインの詰まりを防ぎます。

パラダイム比較:有限ステートマシン(FSM)とビヘイビアツリー(BT)

ビヘイビアツリーがゲーム業界で標準となった真の理由は、有限ステートマシン(Finite State Machines - FSM)がもたらすアーキテクチャ上の行き詰まりを解決するためです。FSMは、各状態(State)間の遷移(Transitions)を、あらかじめ定義された隣接グラフ(adjacency graph)を通じて管理します。2 状態数が少ない場合は構築が容易で完璧に動作するFSMも、状態数が増えるにつれて遷移の組み合わせが指数関数的に増加するため、制御不能な「スパゲッティコード」の混乱へと変貌します。7 これに対しビヘイビアツリーは、階層構造のおかげで、非常に複雑なアクションを単純なタスクの組み合わせ(コンポジション)によって構築します。1 サブタスクがどのように実装されているかは、上位ノードにとってはブラックボックスとして機能します。1 リアクティブな構造のおかげで、外部からの刺激や優先度の高い状態変化があった場合、ツリーはルートから、あるいは特定のイベントリスナー(observers)を通じて自らを再評価し、現在のアクションをキャンセルして状況に適した新しいブランチをアクティブにできます。5 FSMでは遷移を状態そのものの中や別の管理クラスにハードコーディングする必要がありますが、ビヘイビアツリーでは制御フローとアクションの実行が完全に分離されています。2

分析指標

ビヘイビアツリー(Behavior Trees)

有限ステートマシン(FSM / HFSM)

アーキテクチャ構造

階層的、親/子(parent/child)関係に基づく、トップダウンフロー。

隣接グラフ(adjacency graph)およびノード間のエッジ遷移。

スケーラビリティ

高いモジュール性。サブツリーは独立してテスト可能で、グラフが大きくなっても複雑さは線形に増加。

複雑さが増すにつれて遷移管理が指数関数的に困難になる(リスクあり)。

実行ロジック

タスクベース。ノードは各ティックまたはイベントで動的にトップダウンで評価される。

状態ベース。アクティブな状態は、特定の遷移条件が満たされるまで固定される。

リアクティビティ

優先度の高いタスクのための即時キャンセル(abort)および再ルーティングメカニズムが存在。

現在の状態から新しい状態へ遷移するための明示的なルール、終了および開始関数が必要。

メモリ管理

過去の決定はツリー形式で保存されず、システムは毎回ルートまたは現在のノードから処理する(メモリレスなリアクティビティ)。

過去のアクションや決定が現在の状態上に明示的なメモリ(memory)を作成する(表現力が高い)。

表1:AIシステムにおけるビヘイビアツリーと有限ステートマシンの構造的、アルゴリズム的、および運用上の比較。この表は、2つのパラダイムのアーキテクチャ上の違いと使用シナリオを要約しています。1

研究者は、BTを決定木、テレオリアクティブプログラム、FSMと比較した際、FSMは内部変数や過去の決定にアクセスできる状態を構築できるためより「表現力(expressive)」が高い一方、BTは新しい入力やティックごとに実行をルートから開始する(またはイベントで中断する)ため、はるかに「リアクティブ(reactive)」で読みやすいことを証明しました。5 ゲーム開発者は、BTのこのメモリレスでありながら即座に反応する構造を、ブラックボード(Blackboard)と呼ばれるデータストレージユニットで補完することでメモリ不足を解消し、完璧なデータとロジックの分離を実現しました。12

フロー制御の拠点:複合ノード(Composite Nodes)

ビヘイビアツリーにおいて、意思決定メカニズムと論理フローの心臓部は「複合ノード(Composite Nodes)」です。複合ノードは、自身に接続された1つまたは複数の子(child)ノードを持つことができ、それらの子がどの順序で、どの優先順位ルールで、あるいはどの論理条件に基づいて実行されるかを決定する主要な骨格構造です。3 フローのジオメトリは普遍的にトップダウン(親から子へ)および左から右(優先度の高いブランチから二次的なブランチへ)へと進行します。10 システムにおける最も基本的で不可欠な2つの複合ノードモデルは、シーケンス(Sequence)とセレクター(Selector)ノードです。3

シーケンスノード(Sequence Node):論理「AND」フロー

シーケンスノードは、自身に接続された子ノードを、左端の子から右に向かって順次、厳格なルールに従って実行する構成要素です。動作ロジック上、シーケンスノードはプログラミングアーキテクチャにおける論理「AND」ゲートとしてモデル化できます。3 ノードがタスクを正常に完了したとみなされるためには、チェーン内のすべての子ノードが実行され、例外なく「成功(Success)」状態を返す必要があります。3 もしチェーンのどこかの時点で子ノードが「失敗(Failure)」を返すと、シーケンスノードは直ちにその時点で実行を中断し、右側に残っている他の子ノードの実行を放棄して、自身の親に「失敗」状態を伝達します。3

子ノードのいずれかが実行中に「実行中(Running)」状態を返す限り、シーケンスノードは進行を停止し、自身の親に「実行中」状態を返し続けます。3 次のシステムティックでは、シーケンスノードは現在実行中のその子ノードから実行を継続し、最初からやり直すことはありません。

数学的に、シーケンスノードの状態をS、子ノードの状態をそれぞれとした場合、次の方程式で表現できます:

ゲーム開発プロセスにおいて、シーケンスノードは、互いに絶対的に依存しており、時系列順に発生する必要がある複雑なアクションの集合をモデル化するための優れたツールです。古典的な「ドアを開ける」アクションを例に挙げると、AIがドアを開けるアクションは、順に「ドアに向かって歩く」、「ドアの鍵を開ける」、「ドアノブを回して押す」という3つの独立したリーフノードからなるシーケンスブランチの下にまとめることができます。10 もしキャラクターが最初のステップで道を見つけられず、ドアのそばに行けない場合(ナビゲーションエラー - Failure)、アクションのシーケンス全体が失敗に終わります。キャラクターがドアのそばにいないときに「鍵を開ける」コマンドを実行するのは非論理的であるため、シーケンスノードはこのエラーを即座に検知してチェーンを断ち切り、CPUサイクルを節約します。13 同様に、敵エージェントがプレイヤーを攻撃するために構築されたシーケンスブランチは、「プレイヤーに向かって進む」、「射程内にいるか確認する」、「プレイヤーの方を向く」、「攻撃アニメーションを再生する」という形で設計されます。もし射程確認が失敗すれば、回転や攻撃アクションは決して実行されません。14

セレクターノード(Selector / Fallback Node):論理「OR」フロー

セレクターノード(一部のエンジンではFallbackとも呼ばれます)は、シーケンスノードとは正反対の哲学を持ち、柔軟な問題解決者であり、論理的な「OR」ゲートのように動作します。3 このノードは、配下の子ノードを再び左から右への階層順に試行しますが、子ノードが「成功(Success)」した時点で他の代替案の評価を停止し、親に直ちに「成功(Success)」を返します。3 セレクターノードが失敗とみなされるためには、配下のすべての子ノードが例外なく試行され、すべてが「失敗(Failure)」である必要があります。3

シーケンスノードと同様に、実行中の子が「実行中」を返すと、セレクターノードも中断され、「実行中」状態を親に反映します。

数学的な定義は以下の通りです:

ゲームデザインにおいてこの構造は、AIが単一の一般的な目的や目標を達成するために、優先順位付けされた異なるルート、戦術、または反応を試行できるようにするために使用されます。左側が常に最も高い優先度を表すため、設計の実践においては、最も好まれる、コストが最も低い、または最も最適なアクションを左端に配置し、右に行くにつれて代替的でコストが高く、理想的ではない解決策を提示します。3 これは、ツリーアーキテクチャにおいて強力な優先順位(priority)の階層化を生み出します。3

これを例示するために、ドアを開けるシナリオを拡張してみましょう。キャラクターはドアの向こう側に移動する必要があります。セレクターノードの下に3つの異なるアクションまたはサブツリー(Sequence)を並べることができます。左端に「鍵を使う」、中央に「ピッキングで鍵を開ける」(より遅い)、右端に「ドアを壊して開ける」(騒がしく危険)というアクションを配置します。10 エージェントがインベントリに鍵を持っていれば最初のアクションが試行され、成功します。セレクターノードは他のすべての処理をキャンセルし、ドアを通過したことになります。しかし、エージェントが鍵を持っていない場合(Failure)、セレクターノードは諦めず、すぐに右側の「ピッキングを使う」オプションに移行します。それも失敗すれば、最後の手段としてドアを壊すことを試みます。もし3つのアクションすべてが(例えばドアが壊せない鉄のドアである場合)失敗すれば、セレクターノードは初めてその時、親にすべての代替案が尽きたこと(Failure)を報告します。10 この優先順位ベースのORアーキテクチャは、セレクターノードが非常に洗練された、自然に感じられるAIの振る舞いを生み出す真の力を反映しています。

実行操作:デコレーター(修飾)ノード

コンポジットノードが子ノードの順序や実行ロジックを整理するのに対し、デコレーターノード(修飾ノード)はツリー内の制御メカニズムを微調整する役割を担います。ソフトウェア工学における「Decorator」デザインパターンと同名を冠するこの構造は、コンポジットノードとは異なり、単一の子ノード(またはサブツリー)のみを持つことができ、その子の実行ルール、返される結果、またはループメカニズムを外部から鎧のように包み込んで操作します。3 デコレーターは、ブランチを実行できるかどうかを判断する条件付きバリア(Conditionals)やガードノード(Guard Nodes)として機能します。15

デコレーターの基本機能と使用シナリオ

デコレーターのゲームAIにおける最も一般的かつ重要な用途は条件チェック(Conditionals)です。4 AIツリーのブランチは、デコレーターが定義する条件が満たされた場合にのみアクセス可能になります。例えば、敵への攻撃を目的とする「攻撃」ブランチの先頭に配置されたデコレーターは、「敵は視界内にいるか?」や「武器はリロードされているか?」といったチェックを継続的に監視します。3 条件が有効でない場合、デコレーターは子の実行を直ちにブロックし、直接「失敗」(Failure)ステータスを返します。4

条件だけでなく、デコレーターにはフローの結果を直接変更したり、アクションを特定のタイムラインに紐付けたりするバリエーションも存在します 4:

  • Inverter(反転):論理「NOT」ゲートのように動作します。子ノードが失敗すれば親に「成功」を返し、子が成功すれば「失敗」を返します。4 特定の状況が発生しないことを望む場合(例:「敵が近くにいない場合はパトロールせよ」)に使用されます。

  • Succeeder(強制成功):子の結果がどうであれ、たとえ失敗したとしても、親ノードに強制的に「成功」を返します。4 これは、大きなSequenceチェーンの中で、失敗しても重要ではないオプションのタスク(例:「敵に向かって叫ぶ」)がチェーン全体を中断させるのを防ぐために使用されます。18

  • Repeat(ループ / 繰り返し):特定のノードやブランチを、指定回数、無限、または成功/失敗するまで連続して繰り返すことを可能にします。4

  • CooldownおよびTime Out(時間制限):Cooldownは、ブランチの連続する2回の実行の間に強制的な待機時間を設けます(例:スキル使用間隔)。Time Outは、長時間実行されている処理(Running)が一定秒数経過した後に強制的に失敗させてキャンセルすることを可能にします。4

Unreal Engine 5:イベント駆動型ビヘイビアツリーアーキテクチャ

Unreal Engine 5(UE5)は、業界標準のビヘイビアツリー実装を、独自かつ高性能で複雑なアーキテクチャの修正を加えて提供します。これらの修正の中で最も深く、最も重要なのは、UE5のビヘイビアツリーが完全に「イベント駆動型」(Event-Driven)のアーキテクチャ上で動作することです。16 古典的なビヘイビアツリーでは、システムはアクションの妥当性をテストするために、各フレーム(tick)ごとにツリー全体をルートから葉まで継続的に再評価します。この「ポーリング」ベースのアプローチは、数百体の敵が存在するゲームにおいて、CPUパフォーマンスに多大な負荷をかけます。19

Unreal Engineのドキュメントによると、エンジン内のビヘイビアツリーはこの不要な処理負荷を避けるためにパッシブリスニングモードで動作します。システムは毎フレーム条件をチェックする代わりに、Blackboard(ブラックボード)上の変数の変化によってトリガーされる「イベント」を待ち、関連する変数が変化したときにのみツリーの必要なブランチを開いたり、閉じたり、再評価したりします。16

UE5内でのAIプロファイルは、基本的にAIの脳を管理するAI Controller、メモリと変数を保持するデータベースであるBlackboard、判断ロジックを描くBehavior Tree、そしてアクションを実行するTasks、状態をフィルタリングするDecorators、データを更新するServicesという構成要素から成り立っています。12 Blackboard(ブラックボード)は、キャラクターのターゲット、現在位置、視界内の敵、パトロールポイントなどのコンテキストデータを保存し、ビヘイビアツリーから完全に独立して存在するデータクラスです。12 ビヘイビアツリーは単なるロジックプロセッサであり、Blackboardからデータを取得し、判断を下し、アクション(Task)を発火させます。19

UE5におけるコンポジットノード:Selector、Sequence、Simple Parallel

UE5のインターフェースでは、「Selector」ノードはサブツリー間を戦術的に切り替えるために使用される一方、「Sequence」ノードは一連のサブアクションを順番に実行するために使用されます。12 UE5は、従来のシステムに見られる複雑なParallel(並列)ノードの代わりに、使いやすさと安定性のために「Simple Parallel」(単純並列)ノードを使用します。14 Simple Parallelノードには、「メインタスク」(Main Task)と「バックグラウンドブランチ」(Background Branch)という2つの接続先があります。メインタスクは常にリーフノード(Task)でなければなりません。エージェントがメインタスクを実行している間(例:「敵を撃つ」)、バックグラウンドブランチが同時に動作します(例:「敵から離れるように継続的に移動する」)。メインタスクが終了したとき、またはバックグラウンドが終了したときにノードがどう反応するかは設定から構成可能です。14

システムの心臓部:オブザーバー中断(Observer Aborts)メカニズム

Unreal Engine 5のビヘイビアツリーシステムを比類なきものにし、ゲーム内のAIに「生きている」感覚を与える最も基本的な機能は、デコレーター内にハードウェアレベルで統合された「オブザーバー中断」(Observer Aborts)メカニズムです。21 AIエージェントは、特定の外部状況(例えば敵が視界から外れること)を評価するために、ツリーのルートに戻ってすべてのブランチを再巡回する必要はありません。その代わり、デコレーターがBlackboard変数をパッシブに監視(observe)します。17

条件が変化したときにシステムがどのようにブランチをカットするかを決定するObserver Aborts機能は、開発者に4つの異なるパラメータを提供します 22:

オブザーバー中断モード

機能説明と運用的影響

None(なし)

監視が発生しても、即時の割り込み(interrupt)は行われません。ツリーは通常のフローで、デコレーターに階層順が回ってきたときに条件を評価します。優先度の高いイベントが発生しても、優先度の低いタスクを中断させることはできません。

Self(自身)

デコレーターが接続されているノードと、そのノード以下のツリーのみを対象とします。実行中に条件が突然無効になった場合(例えば「攻撃」ブランチ中に敵が射程外に出た場合)、ブランチは即座にキャンセルされ、ツリーは上位階層に「失敗」ステータスを報告します。

Lower Priority(低優先度)

デコレーターは、自身よりも優先度が低い(自身の右側にある)ブランチを監視します。エージェントが右側の低優先度アクションを実行中(例:パトロール)に、このデコレーターの条件が満たされると(例:敵を発見)、システムは直ちに右側のパトロールタスクをキャンセルし、フローを左側(このブランチ内)へ引き寄せます。

Both(両方)

「Self」と「Lower Priority」の両方の機能が同時に動作する、最も反応性の高いモードです。現在実行中のブランチの条件が崩れた場合に自身をキャンセルし、かつ低優先度のアクション中に自身の条件が満たされた場合にも低優先度をキャンセルしてフローを奪取します。

表2:Unreal Engine 5 Observer Abortsパラメータの体系的かつ戦術的な動作。

分析シナリオを通して説明すると、エージェントが「パトロール」シーケンスノードを実行中(低優先度、右ブランチ)に、プレイヤーがエージェントの視界に入ると、Blackboardの「HasLineOfSight」(視界あり)キーが「True」(セット)になります。左側の「追跡」ブランチの先頭にあるデコレーターが「Lower Priority」または「Both」に設定されている場合、システムはパトロールタスクノード(たとえ長いナビゲーションプロセスの途中であっても)を即座にキャンセルし、実行を高優先度の「追跡」ブランチに切り替えます。14 これはオペレーティングシステムにおけるハードウェアの「割り込み」(hardware interrupt)信号のゲームAIにおけるソフトウェア的な対応物であり、AIが極めて反応的で即座な判断を下せるようにします。条件が再び崩れた場合(プレイヤーが隠れた場合)で、デコレーターが「Both」または「Self」に設定されていれば、「追跡」タスクは即座に中断され、システムは右側のパトロールルーチンに戻ります。14 複数のデコレーターが低優先度のタスクを中断しようとする場合、最も左側(最も優先度が高い)のデコレーターの条件が満たされる必要があります。22

UE5アーキテクチャにおけるサービスノード(Service Nodes)

古典的なビヘイビアツリーの概念とは全く異なり、UE5固有に開発されたもう一つの構成要素が「Service」(サービス)と呼ばれる特定のノードタイプです。サービスは、リーフノードのようにアクションを実行したり、デコレーターのようにフローを中断したりすることはありません。コンポジットノード(Selector/Sequence)にのみ追加可能で、そのブランチが実行されている間、バックグラウンドで指定された時間間隔(frequency)で継続的にトリガーされる更新ノードです。27

開発者は、ターゲットの移動位置を追跡したり、プレイヤーまでの距離を計算したり、環境変数をチェックしてBlackboard上のデータを定期的に更新したりするためにサービスを使用します。19 他のゲームエンジンでは、このような周期的なデータ更新のために複雑な並列ブランチ(Parallel Nodes)や重いC#コードを書く必要がありますが、UE5はこれをツリーの特定のブランチに局所化することで、CPUパフォーマンスを驚異的に最適化します。サービスは、接続されているSequenceまたはSelectorがアクティブである限り「Tick」メソッドを実行し、そのブランチから離れると終了してパフォーマンス消費を停止します。27

Unity 6 Behavior Package (v1.0+):モダンで視覚的、かつ多用途なツリーアーキテクチャ

歴史的に、Unityエンジンを使用する開発者は、プロジェクト内の複雑なゲーム内AIソリューションのために、NodeCanvas、Behavior Designer、Playmakerなどのサードパーティ製アセットプラグインに頼らざるを得ませんでした。30 しかし、Unity 6000以降で導入された公式の「Unity Behavior」(バージョン1.0.x)パッケージにより、エンジン統合型でパフォーマンスが最適化され、完全にイベント駆動型の公式なビジュアルロジックエディタを手に入れました。

Unityのエンジニアは、構築したこのモダンな構造を古典的なビヘイビアツリーの厳格な階層から切り離し、ブランチが再結合できる(Join nodes)非線形でより適応性の高い特性を備えていることを強調するために、システム名を「ビヘイビアグラフ」(Behavior Graphs)と名付けました。Unity Behaviorシステムは、エンジンの深部にあるシリアライズ(serialization)インフラストラクチャとC#ロジックに直接統合されています。UE5と同様に、データ転送タスクは「Blackboard」変数を介して管理され、グラフのロジックはイベントベースのトリガーで動作します。システム内のノードは、その普遍的な機能に基づいて2つの主要グループに分けられます。フローの行き先を決定する「フロー制御」(Control flow)ノードと、具体的なアクションを実行する、通常はグレーで色分けされた「アクション」(Action)ノードです。フロー制御ノードは、さらにシーケンス(Sequencing)ノードと修飾(Modifier)ノードに分類されます。

Unityにおけるシーケンスノード:SequenceとTry In Order

Unityパッケージのシーケンスノードは、古典的なツリーのSequenceとSelectorのロジックをそのまま置き換えるものですが、命名と機能的な配置において異なり、革新的な構文を使用しています。従来の「Selector」(セレクター)ノードは、Unityエコシステムでは「Try In Order」(順に試す)と呼ばれています。

  1. Sequence(シーケンス)ノード:古典的なロジックと全く同じように動作します。ブランチを左から右へ順番に実行し、いずれかが失敗すればフローを中断してFailureを返し、すべて成功すればSuccessを返します。Unity Behaviorインターフェースの最も革新的な機能の一つに「暗黙的シーケンス」(Implicit Sequence / Stacking)構造があります。ビジュアルエディタで複数のアクションノードを垂直に積み重ねると(例えば、3つのアニメーションノードを連続して追加した場合)、システムはそれらを接続するために追加のSequenceノードを必要としません。実行時(runtime)には、このスタックされた構造が自動的に隠れたシーケンスノードに変換されます。これにより、視覚的なグラフの複雑さと「スパゲッティ」のような見た目が大幅に削減されます。

  2. Try In Order(セレクター)ノード:その名の通り、このノードは選択肢が「成功」するまでブランチを左から右へ順番に試します。この文脈では、古典的なビヘイビアツリーにおける「Selector」または「Fallback」ノードの完全な論理的対応物です。通常、エージェントが異なる戦略から「最良の選択肢」を見つける必要があるシナリオで使用されます。

  3. Run In ParallelおよびRandomノード:すべての接続されたブランチを同時に(並列に)実行したり、子ノードから完全にランダムに一つを選択したりするために使用されるフロー構造です。並列実行において、親ノードのロジックは「Wait For All」(すべてのブランチが成功して終了するのを待つ)または「Wait For Any」(いずれかのブランチが終了すれば十分)といった細かい詳細設定で構成可能です。

Modifier(修飾子)ノードとイベント駆動型割り込みアーキテクチャ

Unity Behaviorは、従来のツリーにおける「デコレーター」ノードの概念を「Modifier(修飾子)」ノードというカテゴリに集約し、より機能的なフレームワークへと昇華させました。修飾子ノードは、子ノードを1つだけ持つことができ、接続された子ブランチの動作方法、実行回数(Repeat)、戻り値の状態(Inverter、Succeeder)、またはアクティブになる条件(Cooldown)を直接管理する制御構造です。Unityエコシステムにおいて、これらのノードの中でゲームフローを管理する最も重要なサブタイプは、「Abort(中断)」および「Restart(再起動)」モディフィケーションです。Abortノードは、Node Inspectorで設定された条件(例:体力 < 20)が満たされた(Any Are True / All Are True)際に、その下のブランチの実行を直ちに停止し、親ノードにFailureを伝達します。Restartはこれとは逆の論理で、条件が整った際に現在実行中のブランチをリセットし、最初から再起動させます。

Unityのモダンなシステムにおける真の革命は、Unreal Engineの伝説的な「Observer Aborts」メカニズムを直接反映した「Observer-based priority interruption(オブザーバーベースの優先割り込み)」システムです。公式ガイドによると、この構造により、高優先度のアクション(グラフ内の左側のブランチ)が、条件が整った際に低優先度のアクション(右側のブランチ)を自動的に割り込ませることが可能になります。開発者は、敵エージェントがパトロール中に突然攻撃を受けた際、「Patrol(パトロール)」任務を放棄して「Attack(攻撃)」ブランチへ移行させるために、パトロールブランチに長々と終了条件(guard clauses)を記述する必要はありません。高優先度の左側のブランチ(Attack)は、その条件を「Observer Abort」モードで定義します。これにより、システムはバックグラウンドで自動的に右側のパトロールアクションを監視し、条件が発生した際に低優先度の処理をキャンセルしてフローを左側に切り替えます。同様に、「Self」オブザーバーもUnityで有効です。アクティブなブランチの実行中に自身の前提条件が無効になった場合、そのアクションは即座にキャンセルされます。これにより、メンテナンスコストが低く、階層構造が非常に読みやすい(左から右への優先順位)ビヘイビアグラフが作成されます。

さらに、Unity Behaviorはサブグラフ(Subgraphs)を直接サポートしています。複雑な動作(例えばパトロールルートの描画)を小さなグラフとして保存し、「Run Subgraph」ノードを通じて動的または静的にメインツリー内に配置することで、巨大なAIシステムのモジュール設計が保証されます。開発者は、従来のC# MonoBehaviour構造に似たOnStart、OnUpdate、OnEndメソッドを含むスクリプトを使用して、独自のカスタムアクションノード(Custom Action Nodes)をBehaviorシステムに数秒で統合できます。

アーキテクチャの統合:Unreal Engine 5とUnity Behaviorフレームワークの比較分析

業界を支配する2つのゲームエンジンであるUnreal Engine 5とUnityは、AIの意思決定において基本的に同じ数学的理論と、FSMの複雑さを打破する階層構造に基づいているものの、ユーザーインターフェース、用語、および特定の課題解決手法において明確な違いを示しています。

コンセプト / 機能メカニズム

Unreal Engine 5 (Behavior Tree)

Unity Behavior (v1.0+) (Behavior Graph)

論理和(OR)ノード

Selector Node(セレクター)。成功する子ノードが見つかるまで右へ進む。

Try In Order Node。名称以外、機能は完全に同じ。

論理積(AND)ノード

Sequence Node(シーケンス)。古典的な階層ツリー配置。

Sequence Node / Implicit Stacking。垂直配置により自動的に隠れたシーケンスノードが作成される。

ノード条件 / フィルタリング

Decorator Node(デコレーター)。ブランチへの入力を制御する。

Modifier Node / Conditional Branch。フローの方向、ループ回数、論理を変更する。

動的割り込みとリアクティビティシステム

Observer Aborts (None, Self, Lower Priority, Both)。ブラックボード変数をパッシブに監視する。

Observer-Based Priority Interruption (Self, Priority)。高優先度が常に低優先度を割り込む。

バックグラウンドデータ更新

Service Node。コンポジットノードに追加され、ブランチ実行中に一定頻度でティックする。

Run In Parallelノード、C#スクリプト、またはグラフ内のActionノードで並列処理される。

サブツリー構成とモジュール性

Run Behavior Tree(ツリー内から別のツリーをTaskとして実行)。

Run Subgraph(静的または動的変数でサブグラフを配置)。

状態とデータ転送メカニズム

Blackboard Data Asset(独立したデータアセットとKeys)。

Blackboard Variables(視覚的なBlackboardインターフェースとC#参照接続)。

表3:AIビヘイビアツリーのコンセプトにおけるUnreal Engine 5とUnity Behavior(バージョン1.0.15+)の用語および運用上の対応。両エンジンともモジュール性を目指していますが、Unityは命名において「人間による読みやすさ(human-readable)」を優先しています。

分析および運用統計によると、古典的なFSM設計では状態数の2乗に比例して指数関数的に増加する()遷移(transition)数と比較して、Behavior Treeアーキテクチャでは新しい動作を設計する際に新しいアクションやデコレーターノード()を追加するだけで済みます。この線形的な構造成長により、UnityとUnrealの両プラットフォームにおいて、業界標準となった巨大でリアクティブ、かつエラーのないAI設計が可能になりました。ただし、長時間かかる処理がツリーのフリーズを引き起こさないように、「Running(実行中)」状態の操作は非常に重要です。AIエージェントにA地点からB地点への移動命令が出された場合、この任務が完了するまで各ループで「実行中」が返されます。プロセスがエラーなく終了した際、UE5側ではBlueprint内の「Finish Execute」ノードで、Unity側ではC#スクリプトのOnEndメソッドで成功状態が確定されます。

高度なコンセプトとハイブリッドシステム:ステートツリー(State Trees)

ビヘイビアツリーの「記憶を持たないリアクティビティ」モデルは、戦術的な戦闘や瞬間的な判断(マイクロマネジメント)においては比類のない優位性を提供しますが、AIの非常に長期的な気分、過去の文脈、またはマクロモードを制御することには苦労します。開発者から最も多く寄せられる批判の一つは、過去の判断データがツリーの設計内ではなく、必然的にブラックボードやグローバル変数に保持されなければならないという点です。

UE5とUnityエンジンが提供する柔軟性のおかげで、開発者はビヘイビアツリーをFSMと統合することで、これらの構造的制限を克服する方法を見出しました。特にUnreal Engine 5.1以降、エンジンのAIエコシステムに「State Trees(ステートツリー)」と呼ばれる新しく画期的なコンセプトが導入されました。ステートツリーは、FSMとビヘイビアツリーを建築的に融合させたハイブリッドシステムです。ステートツリーは、一般的かつ広範な状態管理(例:戦闘、逃走、パトロール、睡眠)のために状態マシン構造を使用します。しかし、マシンが「戦闘」状態に移行すると、その状態内での秒単位の反応やアクションの集合体は、ツリー論理を使用して特定の遷移やタスクベースの評価に接続されます。

現代のゲームデザイン哲学においてプロフェッショナルが適用する最も優れた手法は、これら2つのシステムを並列実行することです。開発者は、「冷静」、「疑心暗鬼」、「攻撃的」といったエージェントの気分やマクロ状態を、ステートツリーまたはマクロ管理クラスを通じて

管理します。5 システムが「攻撃的」状態に移行すると、FSMがアクションとしてトリガーするのは、実際には複雑な「攻撃ビヘイビアツリー(Behavior Tree)」を実行することになります。エージェントがその瞬間に敵に向かって走るべきか、遮蔽物に隠れてリロードすべきか、あるいは手榴弾を投げるのに適切な距離にいるかといった判断は、BT内のセレクター(Selector)およびシーケンス(Sequence)ノードによって行われます。46 このマクロFSMとミクロBTの統合は、状態マシンの高い表現力と、ビヘイビアツリーの高いリアクティビティを完璧に融合させます。

結論

ビデオゲームにおけるAIの計画実行およびアルゴリズム論理チェーンは、長年にわたり巨大な業界標準となったビヘイビアツリー(Behavior Trees)のおかげで、比類のない柔軟性、モジュール性、および設計階層を獲得しました。シーケンスノードがアクションの厳密な連鎖を保証し、失敗を即座にフィルタリングする一方で、セレクターノードは戦術的な優先順位付け、リアクティブな意思決定、および代替案の確実な試行を可能にします。この複合的な本体を外側から殻のように包み込むデコレーター(修飾子)ノードは、動的な外部刺激への即時反応とフローの操作を可能にしています。Unreal Engine 5は、イベント駆動型のユニークなインフラ、ブラックボードの最適化、微調整を提供するサービス(Service)ノード、そして比類のないObserver Abortメカニズムにより、AIプログラミングにおいて非常に成熟し、パフォーマンスコストの低いエコシステムを提供しています。一方でUnityは、第6世代でエンジンの心臓部に統合された公式のUnity Behavior(ビヘイビアグラフ)パッケージにより、この標準を視覚化し、「Try In Order」のような流暢な命名による可読性、そしてモダンなC#統合による非線形な巨大グラフの構築において、非常にアクセスしやすい次元へと引き上げました。古典的な状態マシン(FSM)に基づいて構築されたこの階層構造は、エージェントの次の動きを選択するだけでなく、大規模なAIシステムの可読性、デバッグプロセス、および再利用可能なサブグラフ(subgraphs)を通じたプロジェクトベースのモジュール性を保証することで、ゲームエンジンエコシステムにおける議論の余地のない権威を強固なものにしています。体系的な分析が示すように、現代のプロジェクトにおいて適切なコンポジション、デコレーション、およびイベント駆動型割り込み(Abort)戦略を正しく使用することは、静的なコードだけでは作成できないほど有機的で、知的で、生きているようなエージェントを作成するための最も基本的かつ重要な条件です。

*情報:画像はGoogle Geminiによって生成されました。

BehaviorTreeGameAIUE5SequenceNodeFSMStateTree
ディープリサーチツール
Google Gemini
Google Gemini
翻訳ツール
Google Gemini
Google Gemini

共有
AI ノード構造のビヘイビアツリーにおける Selector(セレクター)、Sequence(シーケンス)、Decorator(デコレーター)ノード | GameDev Base