ゲームAI(FSM・ビヘイビアツリー・GOAP)

敵やNPCの行動が破綻せず賢く見える仕組みを作りたい人へ。FSM・ビヘイビアツリー・GOAP・ユーティリティAIの内部動作と選び分けを押さえれば、拡張しても壊れない意思決定を設計できます。

応用ゲーム開発ゲームAIビヘイビアツリー有限状態機械GOAP意思決定最終更新: 2026-07-29
3つの要点
TL;DR
  1. FSMは状態と遷移で行動を表す最小構成だが、状態数の増加で遷移が組合せ爆発する。階層型FSM(HFSM)は状態を入れ子にして共通遷移をまとめ、これを緩和する。
  2. ビヘイビアツリーは毎ティック根から評価し、Sequence・Selector・Decorator・Leafを合成する。Running状態により、複数ティックにまたがる行動も宣言的に記述できる。
  3. GOAPは行動の事前条件と効果からゴールへ至る計画をA*で探索し、ユーティリティAIは各選択肢のスコアを評価して最大を選ぶ。前者は手段の組合せ、後者は連続的な状況判断に強い。

意思決定の器:状態遷移から計画・効用へ

ゲームAIの中核は、キャラクターの内部状態と知覚から次に何をするかを決める意思決定です。描画やアニメーション(グラフィックスの基礎 参照)とは層が分かれており、ここで扱うのは「攻撃するか逃げるか探索するか」という行動選択の構造そのものです。代表的な手法は、有限状態機械(FSM)、ビヘイビアツリー(BT)、GOAP、ユーティリティAIの4つで、それぞれ表現できる複雑さ拡張したときの壊れにくさが異なります。学術的な機械学習ベースのAI(AIの基礎)とは別系統で、実行時コストが低く挙動を完全に予測・デバッグできることがゲーム実務では重視されます。

4手法の位置づけ

FSMは「今どの状態か」を明示的に持ち、遷移条件で状態を移す状態中心。BTは行動を木構造に合成し毎ティック評価する制御フロー中心。GOAPは行動を積み木のように組み合わせてゴールへの道筋を探索する計画中心。ユーティリティAIは各行動に数値スコアを付けて最大を選ぶ評価中心。上に行くほど記述が明示的でデバッグしやすく、下に行くほど状況適応的だが挙動の予測が難しくなる、という緩やかな傾きがあります。

有限状態機械(FSM)と階層型FSM

横にスクロール

ゲームAIが知覚を黒板へ集めFSMやビヘイビアツリーで行動を選び結果を戻す図
FSM・ビヘイビアツリー・GOAPの責任配置と、階層化・時間分割を示します。

FSMは、有限個の状態(Idle、Patrol、Chase、Attack など)と、状態間の遷移(条件が満たされたら別状態へ移る矢印)でAIを表します。任意の時点でキャラクターは厳密に1つの状態にあり、各状態は自分の更新処理(OnUpdate)と、他状態への遷移条件だけを知っていればよい。実装は状態を表す列挙値と switch 文、あるいは状態オブジェクトのポインタ差し替えで済み、極めて軽量で挙動も追いやすい。少数の明確な役割を持つ敵には今なお第一の選択肢です。

問題は遷移の組合せ爆発です。状態が N 個あると、原理的には遷移は最大 N×(N-1) 通りあり得ます。「どの状態からでもプレイヤーを見失ったら Patrol へ戻る」といった共通遷移を状態ごとに個別に書くと、状態を1つ足すだけで大量の矢印を追記することになり、保守が破綻します。

これを緩和するのが階層型FSM(Hierarchical FSM、HFSM)です。関連する状態をまとめて1つの上位状態(スーパーステート)に入れ子にし、遷移を階層で共有します。たとえば Patrol・Chase・Attack を「Combat」という上位状態の子として束ね、「体力が閾値未満になったら Flee へ」という遷移を上位状態に一度だけ書けば、内部のどの子状態からでもその遷移が効く。共通の抜け道を親に集約することで、遷移の数を状態数に対して線形近くに抑えられます。

HFSM の入れ子(Combat 上位状態が共通遷移を保持):

  [Combat] ── 体力 < 閾値 ──► [Flee]     ← Combat の全子に効く共通遷移
    ├─ Patrol   ── 敵発見 ──► Chase
    ├─ Chase    ── 射程内 ──► Attack
    └─ Attack   ── 射程外 ──► Chase

  子状態は Combat 内部の遷移だけを持ち、
  「戦闘離脱」のような横断的遷移は親が一括で担う。
FSMがスケールしない理由を正しく理解する

FSMの限界は「状態が多いこと」そのものではなく、遷移が状態の直積に比例して増えることにあります。並行する関心事(体力・警戒度・弾薬)が増えると、それらの組合せを1つの状態集合で表そうとして状態数が掛け算で膨張します。HFSMは階層化で共通遷移を畳みますが、直交する複数の関心事を同時に扱うには並行FSM(複数のFSMを同時に走らせる)が必要で、それでも行動の合成規則を明示しづらい。この「合成のしにくさ」こそが、次のビヘイビアツリーが生まれた動機です。

ビヘイビアツリーのノード種別と実行モデル

ビヘイビアツリー(BT)は、行動を木構造に組み立て、毎ティック(毎フレームまたは一定間隔)で根から深さ優先に評価します。各ノードは実行されると SuccessFailureRunning のいずれかを親へ返し、親はその戻り値に応じて次の子へ進むか、自分の結果を確定します。この3値、とりわけ Running(まだ実行中で複数ティックにまたがる)の存在が、BTを単なる判断木ではなく時間をまたぐ行動の記述言語にしています。

ノードは大きく次の4種です。

  • Composite(合成ノード): 複数の子を持ち、評価順序と合流規則を決める。代表が Sequence と Selector。
  • Decorator(デコレータ): 子をちょうど1つだけ持ち、その結果や実行可否を修飾する(否定・反復・成否反転・条件ガード・クールダウンなど)。
  • Leaf / Action(葉・行動): 実際の処理(移動する、撃つ、アニメ再生)。木の末端。
  • Condition(条件): 世界の状態を真偽で判定する葉(SuccessFailure を返す)。

Composite の2大要素の意味論が最重要です。

  • Sequence(AND的): 子を左から順に実行し、すべてが Success なら自分も Success。途中で1つでも Failure を返した時点で残りを打ち切り、自分も Failure。子が Running を返せば自分も Running を返し、次ティックはその子から再開する。「近づく→狙う→撃つ」のように全部そろって初めて意味を持つ手順を表す。
  • Selector(フォールバック、OR的): 子を左から順に試し、どれか1つが Success を返せば自分も SuccessFailure の子は飛ばして次を試し、全部 Failure なら自分も Failure。「攻撃できるなら攻撃、無理なら追跡、それも無理なら巡回」という優先度つきの代替案を表す。
BT の評価例(! は Inverter デコレータ、括弧内は戻り値):

  Selector                       ← どれか成功で成功(優先度フォールバック)
   ├─ Sequence                   ← 全成功で成功(攻撃シーケンス)
   │   ├─ Condition: 敵が射程内?  (Failure) ─┐ 1つ失敗で
   │   ├─ Action: 狙う                        │ Sequence 打ち切り
   │   └─ Action: 撃つ                        ┘ → Failure を返す
   ├─ Sequence                   ← 次の候補へフォールバック
   │   ├─ Condition: 敵が見える?  (Success)
   │   └─ Action: 追跡           (Running) ── ここで木全体が Running
   └─ Action: 巡回               ← 上が Running なので今ティックは未到達
なぜBTはFSMより素直にスケールするのか

FSMが「状態間の遷移(どこからどこへ)」を明示するのに対し、BTは優先度と合成規則(Selectorの左優先、Sequenceの全達成)で行動を組み上げます。新しい行動は木の適切な位置にサブツリーを1つ挿すだけで追加でき、既存ノードの遷移条件を書き換える必要がない。これがモジュール性・再利用性の源泉です。デコレータで「N秒に1回だけ」「体力があるときだけ」といった横断的制約を局所的に付けられる点も、FSMの状態爆発を回避します。反面、毎ティック根から評価する素朴な実装は無駄が多く、実務ではイベント駆動BTや、状態を持つ並列(Parallel)ノードで最適化します。

GOAPとユーティリティAI:計画と効用による意思決定

BTやFSMは設計者が行動の順序・優先度を手で組む方式です。これに対し、目的から行動列を自動で導くのがGOAP(Goal-Oriented Action Planning)です。各行動(アクション)に「実行できる前提」を表す事前条件(preconditions)と、実行後に世界がどう変わるかを表す効果(effects)を、真偽値の集合として与えます。プランナは、現在の世界状態からゴール条件を満たす状態へ至る行動の並びを、状態空間の探索として求めます。探索はA*が定番で、各行動のコストをエッジ重みに、ゴールとの差分の数などをヒューリスティックにします。

要点は、設計者が手順を書かないことです。「敵を倒す」というゴールと、武器を拾う(前提: 武器が床にある/効果: 武装している)、敵に近づく撃つ(前提: 武装している かつ 射程内)といった行動群だけ定義すれば、武装していない状況ではプランナが自動的に「拾う→近づく→撃つ」を組み立てる。行動を1つ足すだけで新しい手順が創発するため、多様で説明のつく振る舞いを少ない記述で得られます。反面、探索は実行時コストが高く、前提・効果の設計を誤ると意図せぬ計画が出るためデバッグが難しい。

ユーティリティAI(Utility-based AI)は発想がまったく異なります。各候補行動について、状況を入力とするスコア(効用)関数を評価し、最も高い行動を選びます(あるいはスコアに比例した確率で選ぶ)。たとえば「回復する」の効用を体力の低さの関数に、「攻撃する」の効用を敵との距離と自分の弾薬の関数にする。個々の入力は応答曲線(レスポンスカーブ)で0〜1に正規化し、掛け合わせや重み付き和で合成します。これにより、離散的な状態遷移では表しにくい連続的でグラデーションのある判断(少しずつ慎重になる、状況に応じて優先度が滑らかに入れ替わる)を自然に表せます。

観点FSM / HFSMビヘイビアツリーGOAPユーティリティAI
表現の中心状態と遷移行動の合成(優先度)行動の計画(探索)効用スコアの比較
行動の決め方遷移条件で状態遷移根から評価し合成規則で選択ゴールへの行動列をA*探索各行動をスコア化し最大を選択
拡張性遷移が直積で増え爆発しやすいサブツリー追加で局所的に拡張行動追加で手順が自動で創発行動追加は評価関数の追加
実行時コスト極小小〜中(毎ティック評価)大(状態空間の探索)中(全候補のスコア計算)
予測・デバッグ容易(状態が明示)容易(木を追える)難しい(計画が動的)難しい(数値の合成結果)
得意な場面少数の明確な役割の敵複雑だが手で設計する行動手段を組み合わせる問題解決連続的で滑らかな状況判断

知覚と意思決定の分離

どの手法を採っても、意思決定は世界の情報を入力に必要とします。この入力を作るのが知覚(perception/sensing)であり、意思決定ロジックとは層を分けるのが定石です。視覚は視野角と最大距離の視錐台で候補を絞り、遮蔽物へのレイキャストで実際に見えるかを判定します。聴覚は音源からの距離減衰でイベントを届ける。こうして得た情報は、多くの実装でブラックボードという共有データ構造に書き込まれ、FSMの遷移条件やBTの Condition ノード、GOAPの世界状態、ユーティリティの入力がそこを参照する

設計判断のまとめ
  • FSM/HFSM: 状態が明示的で軽量・デバッグ容易。ただし遷移が状態の直積で増える。HFSMは共通遷移を親に集約して緩和する。少数の明確な敵に最適。
  • ビヘイビアツリー: Sequence=全子Success(AND)、Selector=いずれかSuccess(フォールバックOR)、Decorator=子1つを修飾、Leaf=行動/条件。Running で複数ティックの行動を表現。サブツリー追加で局所的に拡張でき、手で設計する複雑な行動に強い。
  • GOAP: 行動の事前条件と効果からゴールへの行動列をA*で探索。設計者は手順を書かず、行動を足すと手順が創発する。実行時コストと計画のデバッグ難が代償。
  • ユーティリティAI: 各行動を効用関数(応答曲線で正規化し合成)でスコア化し最大を選ぶ。連続的・グラデーション的な判断に強いが、数値の合成結果が読みにくい。
  • 知覚は分離: 視錐台・レイキャスト・距離減衰で情報を作り、ブラックボードに集約。意思決定層はそこを参照する。この分離が各手法をモジュール化する鍵。

まとめ

ゲームAIの意思決定は、最小構成のFSMから、階層化で遷移爆発を抑えるHFSM、行動を木に合成して毎ティック評価するビヘイビアツリー、行動の前提・効果からゴールへの道筋をA*探索するGOAP、各行動を効用でスコア化するユーティリティAIへと、扱える複雑さと拡張耐性を高める方向に発展してきました。FSMは状態が明示的で軽く追いやすい反面、遷移が状態の直積で膨張します。BTは Sequence(全AND)・Selector(フォールバックOR)・Decorator(子1つの修飾)・Leaf の合成と Running 状態により、時間をまたぐ行動を宣言的かつモジュラーに書け、サブツリー追加で局所的に拡張できます。GOAPは手順そのものを探索で導くため多様な振る舞いが創発する一方、実行時コストとデバッグ難が代償です。ユーティリティAIは連続的な状況判断に向きますが、数値の合成結果は読み解きにくい。いずれの手法も、視錐台・レイキャスト・距離減衰で作った情報をブラックボードに集約する知覚層と意思決定層を分離することで、はじめてモジュール化されスケールします。単純で予測可能ならFSM、手で組む複雑な行動ならBT、手段の組合せで解く問題ならGOAP、滑らかな判断ならユーティリティ——挙動の複雑さ・実行時コスト・デバッグ容易性のトレードオフで選び、しばしば複数を組み合わせるのが実務の判断軸です。

ゲーム開発の記事ガイド

ゲームAI(FSM・ビヘイビアツリー・GOAP)を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

ゲーム開発

比較で見る軸

難易度: advanced / カテゴリ: ゲーム開発 / タグ数: 6

導入後に効く点

ビヘイビアツリーは毎ティック根から評価し、Sequence・Selector・Decorator・Leafを合成する。Running状態により、複数ティックにまたがる行動も宣言的に記述できる。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
ゲーム開発
タグ数
6

判断チェックリスト

  • 自社の用途が「ゲーム開発 / ゲームAI」に近いか確認する。
  • 強みである「FSMは状態と遷移で行動を表す最小構成だが、状態数の増加で遷移が組合せ爆発する。階層型FSM(HFSM)は状態を入れ子にして共通遷移をまとめ、これを緩和する。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

ゲーム開発ゲームAIビヘイビアツリー有限状態機械GOAP