ひとことで
判断に使う情報を、キーと値の組の「黒板」に書き込んで共有する設計です。「標的」「最後に見た位置」「警戒レベル」などを黒板に置いておけば、判断の部品(ビヘイビアツリーの節、状態、ほかのキャラクター)は、互いを直接知らなくても、黒板を読み書きするだけで連携できます。1 体の AI の中で使う個別の黒板と、チーム全体で共有する黒板があります。
ゲームでの使いどころ
- ビヘイビアツリーの記憶:Unreal Engine のビヘイビアツリーは、条件や行動が読み書きする変数を Blackboard アセットで定義する。「TargetActor」「LastSeenLocation」など。
- チームの連携:見張りの 1 人が見つけた敵の位置を共有し、ほかの見張りが駆けつける。誰がどの方向を担当するかも黒板で取り合う。
- 分隊・指揮官:指揮官の AI が「攻撃目標」を書き、部下の AI がそれを読んで動く。
- ゲーム全体の状況:「警報が鳴っている」「ボスの体力」などを、複数のシステム(AI、音楽、UI)が参照する。
しくみ
黒板は、キーに対して値を持つだけの単純な入れ物です。
| キー | 値 | 書いた人 | 時刻 |
|---|---|---|---|
| 敵の位置 | (3.2, -1.5) | 見張り C | 12.4 秒 |
| 警戒レベル | 警戒 | 見張り C | 12.4 秒 |
| 担当 北 | 見張り A | 見張り A | 10.1 秒 |
書く側は、自分が知ったことを書き込むだけで、誰が読むかを気にしません。読む側は、必要なキーを読むだけで、誰が書いたかを気にしません。部品どうしの結びつきが弱くなるので、見張りを 1 人増やしても、ほかの見張りのコードを変えずに済みます。
時刻を付けるのが大切です。「敵の位置」が 20 秒前のものなら、もう信用できません。読む側は、値の古さを見て、使うか無視するかを決めます。また、値が変わったときに知らせる仕組み(監視)を用意すると、ビヘイビアツリーが「標的が変わったら評価し直す」ことができます。
実装のポイント
- キーを型で定義する:文字列のキーは打ち間違えやすいので、キーと値の型の一覧を定義しておきます(Unreal の Blackboard アセットと同じ考え方)。
- 取り合いの記録:「担当 北」のように、役割を黒板に書いて取り合うと、全員が同じ場所へ殺到せず、自然に分担できます。役割を手放すときに消し忘れないようにします。
- 個別と共有を分ける:自分だけの記憶(今の目的地など)は個別の黒板に、チームに伝えたいこと(敵の位置など)は共有の黒板に、と分けます。
- 何でも入れない:黒板は便利なので、何でも放り込みがちです。誰が書き、誰が読むのかが追えなくなるので、キーごとに持ち主を決めます。
つまずきやすい点
- 古い情報:時刻を持たせずに値だけを置くと、とっくに逃げた敵の位置へ全員が向かい続けます。
- 全員が知りすぎる:共有の黒板をそのまま使うと、見えていないはずの敵の位置を全員が知っている「ずるい AI」になります。伝わるまでの遅れや、無線の届く範囲を設けると自然になります。
- 書き込みの競合:複数の見張りが同じキーに同時に書くと、どちらが残るかが順番しだいになります。新しい時刻を優先する、確かさの高い方を優先する、などの規則を決めます。
デモで試すこと
- 4 人の見張りが、それぞれの部屋を巡回しています。緑の球(プレイヤー)を見つけた見張りが、黒板に「敵の位置」「見つけた人」を書き込みます(黄色の線)。右下の表で、黒板の中身と経過時間がわかります。
- ほかの見張りは黒板を読んで(青い線)駆けつけます。「担当 北」「担当 東」などの方向を黒板で取り合うので、同じ所に集まらず、取り囲むように動きます。
- 「見張りごとの記憶だけ」に切り替えると、見つけた見張りしか反応せず、ほかの見張りは巡回を続けます。
- 緑の球をドラッグして物陰に隠れると、時間がたつにつれて黒板の情報が古くなり、8 秒で警戒が解けて巡回に戻ります。