ひとことで
敵やNPC の判断を、「条件を確かめる節」と「行動する節」を木の形に組み合わせて作る方法です。毎フレーム(または一定間隔で)根から木をたどり、各節は「成功」「失敗」「実行中」のどれかを返します。左の枝ほど優先度が高く、条件が崩れればすぐ別の枝に切り替わります。行動の部品を組み替えるだけで判断を作れ、見た目でも構造がわかりやすいので、Unreal Engine をはじめ、多くのゲームで使われています。
ゲームでの使いどころ
- 敵の戦闘 AI:「体力が少なければ逃げる」「敵が近ければ攻撃」「見えれば追う」「物音がしたら調べる」「それ以外は巡回」のような優先順位つきの判断。
- NPC の日常の行動:「お腹が空いたら食事」「夜なら家に帰る」「それ以外は仕事」。
- ボスの行動パターン:体力の段階ごとに枝を分け、攻撃の組み合わせをシーケンスで並べる。
- 部品の使い回し:「目的地まで歩く」「プレイヤーの方を向く」などの行動の節を、いろいろな敵の木で共有する。
しくみ
節の種類は大きく 4 つです。
| 節 | 動き |
|---|---|
| セレクター(?) | 子を左から順に実行し、最初に失敗しなかった子の結果を返す。「どれか 1 つ」 |
| シーケンス(→) | 子を左から順に実行し、失敗か実行中の子が出たらそこで止まる。全部成功なら成功。「順番に全部」 |
| 条件 | 「敵が見える?」のような問いに、成功か失敗を即座に返す |
| 行動 | 「敵へ走る」のように、終わるまで実行中を返し、終われば成功を返す |
さらに、子の結果を反転する、くり返す、時間を区切るといった「デコレーター」を挟むこともあります。
毎回根から評価し直すのが大事な点です。「追跡」を実行中でも、次のフレームで左の「攻撃」の条件(近い?)が成功すれば、そちらが選ばれ、追跡は自動的に中断されます。優先度の高い判断が、いつでも割り込めるわけです。中断された行動は、次にまた最初から始められるよう、状態を片づけておきます。
実装のポイント
- 情報の置き場所:「最後に見た位置」「聞いた物音」などは、節の中ではなくブラックボードに置き、条件と行動がそこを読み書きします。節どうしが直接知り合わずに済みます。
- 途中で条件が崩れる問題:「体力が少ない?」を条件にした回復の枝は、休んで体力が少し戻った瞬間に条件が失敗し、回復が中断されます。「回復中」の印を覚えておき、満タンになるまで条件を成功させ続けます(デモもこの方法です)。
- 評価の頻度:大きな木を毎フレーム全部たどるのは重くなります。実行中の節から再開し、条件の変化(イベント)があったときだけ上から評価し直す「イベント駆動」の方式もあります(Unreal Engine の方式)。
- 確率やクールダウン:攻撃の種類をランダムに選ぶ節、一度使ったら数秒使えない節などを、デコレーターとして用意しておくと表現が広がります。
つまずきやすい点
- 木が深く大きくなりすぎる:判断を全部 1 本の木に書くと、見通しが悪くなります。「戦闘」「探索」などの部分木に分けて、ほかの木から呼び出します。
- 何度も切り替わる:2 つの枝の条件が境目でちらつくと、毎フレーム枝が入れ替わってガタガタ動きます。条件に余裕(ヒステリシス)を持たせるか、一度始めた行動をしばらく続けさせます。
- 状態を持つ判断は苦手:「警戒 → 追跡 → 捜索」のように、今までの流れで次が決まる判断は、有限状態機械の方が素直に書けることがあります。両方を組み合わせるのもよくある方法です。
デモで試すこと
- 右下の木で、今のフレームに通った節が色付きで表示されます(成功=緑、失敗=赤、実行中=黄)。何もないときは、上の枝の条件がすべて失敗して、いちばん右の「巡回」が実行されます。
- 床をクリックして物音を立てると、「調べる」の枝が動き出し、見張りが音の所へ行って見回します。その途中で緑の球(プレイヤー)が視界に入ると、優先度の高い「追跡」に割り込まれます。
- 見張りがプレイヤーに近づくと「攻撃」に移り、反撃で体力が減っていきます。30 を切ると、いちばん左の「補給」が何よりも優先され、回復地点へ向かいます。
- 「見張りに傷を負わせる」を押すと、すぐに補給の枝へ切り替わります。満タンになるまで休み続けることを確かめてください。