Behavior Treeの概要
Unreal Engineでゲーム開発を進める中で、「敵AIの動きが単調で面白くない」「複雑な状況判断をさせようとするとBlueprintがスパゲッティコードになってしまう」といった課題に直面していませんか?
特に、プレイヤーの発見、追跡、攻撃、そして見失った際の巡回といった、複数の行動を状況に応じて切り替えるAIを実装しようとすると、従来のステートマシン(State Machine)では管理が非常に煩雑になりがちです。
本記事では、このような複雑なAIの意思決定を、視覚的かつ階層的に 設計できるUnreal Engineの強力なAIツール、Behavior Tree(ビヘイビアツリー) について、その基本概念から、初心者でもすぐに実践できる具体的な実装手順までを、豊富なBlueprint例とともに徹底的に解説します。
Behavior Treeとは
Behavior Treeは、AIが「次に何をすべきか」を決定するための階層的な意思決定構造です。ツリーのルートから始まり、ノードを辿りながら、AIの行動を上から順に、あるいは条件に応じて実行していきます。
主要な構成要素
Behavior Treeを理解する上で、以下の3つの主要な要素は欠かせません。
| 要素名 | 役割 | 詳細 |
|---|---|---|
| Behavior Tree (BT) | 意思決定の構造 | AIの行動ロジック全体を定義するツリー構造。 |
| Blackboard (BB) | AIのメモリ/データ | AIが共有するデータ(ターゲットの位置、HP、現在の状態など)を格納する場所。BTのノードはBBの情報を参照・更新して動作を決定します。 |
| AI Controller | AIの制御役 | BTとBBを所有し、Pawn(キャラクター)を操作するコントローラー。 |
ノードの種類
Behavior Treeは、主に以下の4種類のノードで構成されます。
- コンポジットノード (Composite Nodes): 子ノードの実行順序を制御します。
- Sequence (シーケンス): 子ノードを左から順に実行し、すべて成功した場合に成功を返します。途中で失敗した場合は、その時点で失敗を返します。
- Selector (セレクター): 子ノードを左から順に実行し、いず れか一つが成功した場合に成功を返します。すべて失敗した場合に失敗を返します。
- タスクノード (Task Nodes): AIに具体的な行動(移動、攻撃、待機など)を実行させるノードです。通常、カスタムのBlueprintまたはC++で作成します。
- デコレーターノード (Decorator Nodes): 子ノードの実行可否を判断する条件ノードです。Blackboardの値やAIの状態をチェックします。
- サービスノード (Service Nodes): 一定間隔で実行され、Blackboardの値を更新したり、周囲の状況を監視したりするノードです。
敵AIの実装例
ここでは、最も一般的な敵AIの動作である「プレイヤーの索敵(パトロール)」「発見後の追跡」「一定距離での攻撃」をBehavior Treeで実装する手順を解説します。
AI ControllerとBlackboardの設定
まず、AIを制御するための基本設定を行います。
- AI Controllerの作成:
AIControllerクラスを継承したBlueprintを作成し、敵PawnのデフォルトAIコントローラーに設定します。 - Blackboardの作成: コンテンツブラウザで右クリッ クし、
Artificial Intelligence->Blackboardを選択してBlackboardアセットを作成します。 - Blackboard Keyの追加: 作成したBlackboardを開き、以下のKeyを追加します。
TargetActor(Object型): プレイヤーなど、AIが追跡・攻撃するターゲット。IsTargetDetected(Boolean型): ターゲットを発見したかどうか。PatrolLocation(Vector型): 巡回目標地点。
- Behavior Treeの作成:
Artificial Intelligence->Behavior Treeを選択してBTアセットを作成します。BTアセットを開き、詳細パネルのBlackboard Asset にBlackboardアセットを設定します。AI ControllerではRun Behavior TreeノードでこのBTアセットを指定するだけで、Blackboardは自動的に関連付けられます。
💡 Blackboardの設定場所
BlackboardはBTアセット側で設定するのが一般的です。AI Controller側ではBTアセットのみを指定し、Blackboardを別途指定する必要はありません。
Behavior Treeの設計
AIの意思決定は、以下のロジックで構成します。
AIのロジック:
- Selector: ターゲットを発見しているか?
- YESの場合 (Sequence): ターゲットを追跡し、攻撃する。
- NOの場合 (Sequence): 巡回(パトロール)する。
索敵(Serviceノード)の実装
AIがプレイヤーを発見したかどうかを定期的にチェックするロジックをServiceノードで実装します。
- Serviceノードの作成:
BTService_BlueprintBaseを継承したBlueprint(例:BTS_CheckForTarget)を作成します。 - ロジックの実装:
Receive Tick AIイベントで、Sphere TraceやGet Actors in Rangeなどを使用してプレイヤーを索敵します。 - Blackboardの更新: プレイヤーを発見した場合、Blackboardの
TargetActorにプレイヤーを設定し、IsTargetDetectedをTrueに設定します。見失った場合はFalseに戻します。 - BTへの配置: Behavior Treeのルート直下のSelectorノードに、このServiceノードをアタッチします。
💡 より効率的な索敵:AIPerceptionコンポーネント
Serviceノードでの定期的な索敵(Tickベース)は簡単ですが、パフォーマンスの観点からはAIPerceptionComponent の使用が推奨されます。AIPerceptionは** イベント駆動型** であり、
OnTargetPerceptionUpdatedイベントを使ってターゲットを検知したときだけBlackboardを更新できます。多数のAIが存在する大規模なゲームでは、この方法の方が効率的です。
追跡と攻撃(Taskノード)の実装
- 追跡Task: 標準の
Move Toタスクノードを使用します。このノードのBlackboard Keyに、Blackboardで作成したTargetActorを指定します。 - 攻撃Task:
BTTask_BlueprintBaseを継承したBlueprint(例:BTT_AttackTarget)を作成します。Receive Execute AIイベントで、攻撃アニメーションの再生やダメージ処理を行い、Finish ExecuteノードでSuccess