【Unity】UnityのBehavior Treeで敵AIを設計する:Sequence・Selector・Unity 6 Behavior

作成: 2026-07-12最終更新: 2026-07-13

敵AIが複雑になるとステートマシンでは分岐が爆発します。Behavior Treeは振る舞いを木構造で組み立て、再利用・拡張しやすくする定番手法。Sequence・Selector・条件・アクションの基本ノード、Success/Failure/Running、ステートマシンとの使い分け、Unity 6のBehaviorパッケージ、巡回→発見→追跡→攻撃の実装まで解説します。

敵AIに「巡回して、プレイヤーを見つけたら追いかけて、近づいたら攻撃して、見失ったら巡回に戻る」——こんな振る舞いを ステートマシン で組むと、状態が増えるほど「どの状態からどの状態へ」の遷移が爆発的に増えて、こんがらがってきます。そこで中〜大規模なAIで定番なのが Behavior Tree(ビヘイビアツリー) 。振る舞いを 木構造 で組み立て、再利用と拡張をぐっと楽にする手法です。

この記事では、Behavior Treeの 基本ノード(Sequence・Selector・条件・アクション)と Success/Failure/Running の考え方、ステートマシンとの使い分けUnity 6のBehaviorパッケージ、そして 巡回→発見→追跡→攻撃 の敵AIを組む実践までを解説します。

フラットな青のツリー構造。Rootから枝分かれし、Sequence・Selectorのノードを経て、葉の条件・アクションへとつながり、敵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にも共通です

Sponsored

Behavior Treeの基本ノード

Behavior Treeは、木構造をルート(Root)から下へたどりながら実行されます。ノードは大きく 「枝(合成ノード)」「葉(条件・アクション)」 に分かれます。まずこの4つを押さえれば、どんなBTも読めるようになります。

Behavior Treeの4つの基本ノード比較図。Sequence(子を順に実行、1つでも失敗したら失敗)、Selector(子を順に試し、1つでも成功したら成功)、条件(状況の真偽を判定)、アクション(実際の動作を実行)を、それぞれの役割とともに並べて示す
ノード役割
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/Failure/Runningの図。ノードはSuccess(成功・緑)、Failure(失敗・赤)、Running(実行中・青)のいずれかを親に返す。移動などの複数フレームかかる処理はRunningを返し続け、完了時にSuccessを返す様子を示す
  • Success(成功): そのノードの処理が成功した。Sequenceは次の子へ進み、Selectorはそこで成功を確定する
  • Failure(失敗): 処理が失敗した。Sequenceはそこで失敗を確定し、Selectorは次の子を試す
  • Running(実行中): まだ終わっていない。 次のフレームに続く という意味で、木は毎フレーム評価され、Runningのノードから再開する

特に重要なのが Running です。「目的地まで移動する」「攻撃モーションを再生する」のように 複数フレームかかる処理 は、完了するまで毎フレーム Running を返し続け、終わったら Success を返します。これにより、BTは「歩いている途中」といった継続的な行動を自然に表現できます。

ステートマシンとの使い分け

「じゃあ ステートマシン はもういらないの?」——いいえ。両者は得意分野が違い、規模で使い分けます。

ステートマシンとBehavior Treeの対比図。左のFSMは状態(巡回・追跡・攻撃)が円で並び、矢印で相互に遷移する(状態が増えると矢印が爆発)。右のBTは木構造で振る舞いを階層化し、優先順位で整理する。それぞれの構造の違いを示す
  • ステートマシン(FSM): 「今どの 状態 か」で考える。状態同士の遷移を矢印で結ぶ。 状態が少なくシンプルな挙動 に最適。ただし状態が増えると、遷移の矢印が N×N に増えて破綻しやすい
  • Behavior Tree(BT): 「やることの 優先順位付きの木 」で考える。振る舞いを階層で整理し、枝を付け替えるだけで拡張できる。 分岐が多く、再利用したい複雑なAI に向く

目安はシンプルです。 状態が3〜4個で収まるならFSM、それ以上に分岐が増えてきたらBT 。「巡回とやられだけ」の雑魚敵ならFSMで十分ですが、「巡回・警戒・追跡・攻撃・退避・回復…」と振る舞いが増えるボス級のAIは、BTのほうが圧倒的に管理しやすくなります。いきなりBTから始めず、FSMで手狭になってから移行するのが現実的です。

Sponsored

Unity 6のBehaviorパッケージ

Unity 6では、公式の Behaviorパッケージ(com.unity.behavior が登場し、Behavior Treeを グラフエディタで視覚的に 組めるようになりました。ノードをドラッグでつなぎ、木を目で見ながら設計できます。

Unity 6 BehaviorのBlackboardの図。ツリーの各ノードが、Blackboard(共有の変数置き場)にあるTarget(追跡対象)やLastKnownPosition(最後に見た位置)といった変数を読み書きして、ノード間で情報を共有する様子を示す
  • グラフエディタ: 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の追ってくるモンスター、ステルスゲームの警備兵——どれもこの構造で作れます。

実践のBT完成図。RootのSelectorの下に、優先順位順で「攻撃Sequence(近い?→攻撃)」「追跡Sequence(見える?→追う)」「巡回Action」が並ぶ。上から順に条件を試し、最初に成立した振る舞いが実行される木構造を示す

Unity Behaviorでこの警備員AIを動かすまでの手順は、次の4ステップです。

  1. Behavior Graphアセットを作成: Projectウィンドウで右クリック → Create > Behavior > Behavior Graph
  2. 敵にエージェントを付ける: 敵のGameObjectに BehaviorGraphAgent コンポーネントを追加し、作ったGraphを割り当てる
  3. BlackboardにPlayerを登録: Graph内のBlackboardにTarget(Transform型)などの変数を作り、BehaviorGraphAgentのInspectorでシーン上のPlayerを割り当てる。ノードはこの変数経由でプレイヤーを参照する
  4. 再生して目で追う: 再生中に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はどんどん賢くなります。あなたのゲームの敵は、どんな判断で動きますか?

さらに学ぶために