敵AIに「巡回して、プレイヤーを見つけたら追いかけて、近づいたら攻撃して、見失ったら巡回に戻る」——こんな振る舞いを ステートマシン で組むと、状態が増えるほど「どの状態からどの状態へ」の遷移が爆発的に増えて、こんがらがってきます。そこで中〜大規模なAIで定番なのが Behavior Tree(ビヘイビアツリー) 。振る舞いを 木構造 で組み立て、再利用と拡張をぐっと楽にする手法です。
この記事では、Behavior Treeの 基本ノード(Sequence・Selector・条件・アクション)と Success/Failure/Running の考え方、ステートマシンとの使い分け、Unity 6のBehaviorパッケージ、そして 巡回→発見→追跡→攻撃 の敵AIを組む実践までを解説します。
この記事でわかること
- Behavior Treeの 基本ノード(Sequence・Selector・条件・アクション)
- Success / Failure / Running の3つの結果
- ステートマシンとの使い分け(FSM vs BT)
- Unity 6 Behaviorパッケージ(グラフ・Blackboard・カスタムAction)
- 実践:巡回→発見→追跡→攻撃 の敵AIをBTで組む
動作確認環境: Unity 6(6000.0)+ Behavior パッケージ 1.0系。Behaviorパッケージは更新で画面やAPIが変わりやすいため、手元の版と表示が違う場合は 公式ドキュメント を参照してください。BTの考え方自体は2022.3にも共通です
Behavior Treeの基本ノード
Behavior Treeは、木構造をルート(Root)から下へたどりながら実行されます。ノードは 大きく 「枝(合成ノード)」 と 「葉(条件・アクション)」 に分かれます。まずこの4つを押さえれば、どんなBTも読めるようになります。

| ノード | 役割 |
|---|---|
| Sequence | 子を 順に実行 し、全部成功で成功。1つでも失敗したらそこで失敗(=AND) |
| Selector | 子を 順に試し、1つでも成功したら成功。全部失敗で失敗(=OR、フォールバック) |
| 条件(Condition) | 「プレイヤーが見えるか」など 状況の真偽 を判定する葉 |
| アクション(Action) | 「移動する」「攻撃する」など 実際の動作 を実行する葉 |
この2つの合成ノードの組み合わせが、BTの心臓部です。 Sequence は「Aして、Bして、Cする」 という手順を、 Selector は「まずAを試し、ダメならB、それもダメならC」 という優先順位を表します。たとえば「Selectorの下に『攻撃するSequence』『追跡するSequence』『巡回するAction』を優先順で並べる」だけで、「攻撃できるなら攻撃、無理なら追跡、それも無理なら巡回」という賢い判断が組めます。
Success・Failure・Runningの3つの結果
BTの各ノードは、実行されるたびに 3つの結果のどれか を親に返します。この仕組みが、木全体の流れを制御します。

- Success(成功): そのノードの処理が成功した。Sequenceは次の子へ進み、Selectorはそこで成功を確定する
- Failure(失敗): 処理が失敗した。Sequenceはそこで失敗を確定し、Selectorは次の子を試す
- Running(実行中): まだ終わっていない。 次のフレームに続く という意味で、木は毎フレーム評価され、Runningのノードから再開する
特に重要なのが Running です。「目的地まで移動する」「攻撃モーションを再生する」のように 複数フレームかかる処理 は、完了するまで毎フレーム Running を返し続け、終わったら Success を返します。これにより、BTは「歩いている途中」といった継続的な行動を自然に表現できます。
ステートマシンとの使い分け
「じゃあ ステートマシン はもういらないの?」——いいえ。両者は得意分野が違い、規模で使い分けます。

- ステートマシン(FSM): 「今どの 状態 か」で考える。状態同士の遷移を矢印で結ぶ。 状態が少なくシンプルな挙動 に最適。ただし状態が増えると、遷移の矢印が N×N に増えて破綻しやすい
- Behavior Tree(BT): 「やることの 優先順位付きの木 」で考える。振る舞いを階層で整理し、枝を付け替えるだけで拡張できる。 分岐が多く、再利用したい複雑なAI に向く
目安はシンプルです。 状態が3〜4個で収まるならFSM、それ以上に分岐が増えてきたらBT 。「巡回とやられだけ」の雑魚敵ならFSMで十分ですが、「巡回・警戒・追跡・攻撃・退避・回復…」と振る舞いが増えるボス級のAIは、BTのほうが圧倒的に管理しやすくなります。いきなりBTから始めず、FSMで手狭になってから移行するのが現実的です。
Unity 6のBehaviorパッケージ
Unity 6では、公式の Behaviorパッケージ(com.unity.behavior) が登場し、Behavior Treeを グラフエディタで視覚的に 組めるようになりました。ノードをドラッグでつなぎ、木を目で見ながら設計できます。

- グラフエディタ: Package Managerで
com.unity.behaviorを導入し、Behavior Graphアセットを作成。ノードを並べてツリーを組む - Blackboard(ブラックボード): ツリー全体で共有する 変数の置き場 。「追跡対象(Target)」「最後に見た位置(LastKnownPosition)」などをここに置き、各ノードが読み書きして情報を共有する。ノード同士を疎結合に保つ要
- カスタムActionノード: 標準ノードで足りない動作は、C#で自作できます。
Actionを継承し、OnStart/OnUpdateで処理を書き、Status(Success/Failure/Running)を返します
using Unity.Behavior;
using UnityEngine;
// Blackboardの目的地へ移動するカスタムActionノードの例
[NodeDescription(name: "Move To Target", category: "Action")]
public partial class MoveToTargetAction : Action
{
[SerializeReference] public BlackboardVariable<Transform> Target;
[SerializeReference] public BlackboardVariable<float> Speed = new(3f);
protected override Status OnUpdate()
{
if (Target?.Value == null) return Status.Failure;
var self = GameObject.transform;
self.position = Vector3.MoveTowards(
self.position, Target.Value.position, Speed.Value * Time.deltaTime);
// 到着したら成功、まだなら実行中(次フレームに続く)
return Vector3.Distance(self.position, Target.Value.position) < 0.1f
? Status.Success : Status.Running;
}
}
2022.3には公式BTが無い:
com.unity.behaviorはUnity 6系の機能です。Unity 2022.3 LTSで使いたい場合は、Behavior Designer などのサードパーティ製アセットが定番です。ノードや用語は実装ごとに少し異なりますが、Sequence / Selector / Success・Failure・Running という BTの考え方は共通 です。
実践:巡回→発見→追跡→攻撃の敵AI
BTの威力がいちばん分かるのが、複数の振る舞いを優先順位で束ねる敵AIです。メトロイドヴァニアの徘徊する番兵、見下ろし型ARPGの追ってくるモンスター、ステルスゲームの警備兵——どれもこの構造で作れます。

Unity Behaviorでこの警備員AIを動かすまでの手順は、次の4ステップです。
- Behavior Graphアセットを作成: Projectウィンドウで右クリック →
Create > Behavior > Behavior Graph - 敵にエージェントを付ける: 敵のGameObjectに
BehaviorGraphAgentコンポーネントを追加し、作ったGraphを割り当てる - BlackboardにPlayerを登録: Graph内のBlackboardに
Target(Transform型)などの変数を作り、BehaviorGraphAgentのInspectorでシーン上のPlayerを割り当てる。ノードはこの変数経由でプレイヤーを参照する - 再生して目で追う: 再生中にGraphエディタを開くと、 いま実行中のノードがハイライト されます。「巡回→発見→追跡」と振る舞いが切り替わる様子を、木の上でそのまま観察できます
木の構造は、 Root直下にSelectorを置き、優先順位の高い振る舞いから順に並べる だけです。
Root
└── Selector(上から順に試す)
├── Sequence:攻撃
│ ├── 条件:プレイヤーが攻撃範囲内か?
│ └── アクション:攻撃する
├── Sequence:追跡
│ ├── 条件:プレイヤーが見えるか?(視界判定)
│ └── アクション:プレイヤーへ移動する
└── アクション:巡回する(デフォルト行動)
毎フレーム、Selectorが上から順に子を試します。 「攻撃範囲内なら攻撃」→ダメなら「見えるなら追跡」→それもダメなら「巡回」 と、自動で優先順位通りに振る舞いが選ばれます。ポイントは2つです。 「優先度の高い行動を上に置く」(Selectorは上から試すので、並び順がそのまま優先順位になる)と、 「条件とアクションをSequenceで組にする」(「見えるなら追う」は『条件→アクション』のSequence。条件が失敗すればSequenceごと失敗し、Selectorは次の子へ移る)。「見失ったら巡回に戻る」も、視界の条件がFailureを返せば自動で巡回に落ちる——特別な遷移コードは要りません。追跡の移動には NavMeshでAIパスファインディング を組み合わせると、障害物を避けて追ってくる本格的な敵になります。
おまけ:先に知っておくと良いこと
- まずはFSMで十分なことも多い: BTは強力ですが、セットアップと学習コストがかかります。雑魚敵など振る舞いが単純なものは ステートマシン のほうが手早いです。「FSMで分岐が辛くなってきた」と感じてからBTに移すのが健全です。
- Runningの返し忘れに注意: 移動や再生など複数フレームかかる処理で、完了前に
Successを返してしまうと、木が先へ進んでAIがカクつきます。「まだ終わっていないならRunning」を徹底しましょう。 - 視界判定はRaycastで: 「プレイヤーが見えるか」の条件は、敵からプレイヤーへ Raycast を撃ち、間に壁がないかで判定するのが定番です。角度(視野角)も併せて見るとステルスゲームらしくなります。
- Blackboardで疎結合に: ノードが直接お互いを参照すると、木の組み替えが辛くなります。共有したい値はBlackboardに置き、ノードはそこ経由でやり取りすると、枝の付け替えや再利用がスムーズです。
まとめ
- Behavior Treeは振る舞いを 木構造 で組む手法。Sequence(順に実行・AND) と Selector(成功まで試す・OR) が心臓部
- 各ノードは Success / Failure / Running を返す。複数フレームの処理は完了まで
Runningを返し続ける - 状態が少なければFSM、分岐が増えたらBT。いき なりBTでなく、FSMで手狭になってから移行する
- Unity 6は公式 Behaviorパッケージ(グラフ・Blackboard・カスタムAction)。2022.3はBehavior Designer等のアセット
- 実践:Root直下のSelectorに 攻撃→追跡→巡回 を優先順で並べるだけで、賢い敵AIになる
まずは「巡回」と「追跡」の2つだけの小さなBTから始めてみてください。Selectorに2つ足すだけで、もう「見つけたら追ってくる敵」が動きます。そこに攻撃や退避を枝として足していけば、AIはどんどん賢くなります。あなたのゲームの敵は、どんな判断で動きますか?
さらに学ぶために
- ステートマシン設計パターン ——BTの前段。FSMとの違いと使い分け
- NavMeshでAIパスファインディング ——追跡アクションが呼ぶ経路探索
- Raycast完全ガイド ——視界判定(プレイヤーが見えるか)の実装
- Unity公式ドキュメント:Unity Behavior ——Behaviorパッケージの一次情報