経路探索・意思決定

ブラックボード

Blackboard Architecture

標的や警戒状態を判断処理の間で共有する。

9 / 10

インタラクティブデモ

デモを準備しています…

ブラックボード

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

判断に使う情報を、キーと値の組の「黒板」に書き込んで共有する設計です。「標的」「最後に見た位置」「警戒レベル」などを黒板に置いておけば、判断の部品(ビヘイビアツリーの節、状態、ほかのキャラクター)は、互いを直接知らなくても、黒板を読み書きするだけで連携できます。1 体の AI の中で使う個別の黒板と、チーム全体で共有する黒板があります。

ゲームでの使いどころ

  • ビヘイビアツリーの記憶:Unreal Engine のビヘイビアツリーは、条件や行動が読み書きする変数を Blackboard アセットで定義する。「TargetActor」「LastSeenLocation」など。
  • チームの連携:見張りの 1 人が見つけた敵の位置を共有し、ほかの見張りが駆けつける。誰がどの方向を担当するかも黒板で取り合う。
  • 分隊・指揮官:指揮官の AI が「攻撃目標」を書き、部下の AI がそれを読んで動く。
  • ゲーム全体の状況:「警報が鳴っている」「ボスの体力」などを、複数のシステム(AI、音楽、UI)が参照する。

しくみ

黒板は、キーに対して値を持つだけの単純な入れ物です。

キー値書いた人時刻
敵の位置(3.2, -1.5)見張り C12.4 秒
警戒レベル警戒見張り C12.4 秒
担当 北見張り A見張り A10.1 秒

書く側は、自分が知ったことを書き込むだけで、誰が読むかを気にしません。読む側は、必要なキーを読むだけで、誰が書いたかを気にしません。部品どうしの結びつきが弱くなるので、見張りを 1 人増やしても、ほかの見張りのコードを変えずに済みます。

時刻を付けるのが大切です。「敵の位置」が 20 秒前のものなら、もう信用できません。読む側は、値の古さを見て、使うか無視するかを決めます。また、値が変わったときに知らせる仕組み(監視)を用意すると、ビヘイビアツリーが「標的が変わったら評価し直す」ことができます。

実装のポイント

  • キーを型で定義する:文字列のキーは打ち間違えやすいので、キーと値の型の一覧を定義しておきます(Unreal の Blackboard アセットと同じ考え方)。
  • 取り合いの記録:「担当 北」のように、役割を黒板に書いて取り合うと、全員が同じ場所へ殺到せず、自然に分担できます。役割を手放すときに消し忘れないようにします。
  • 個別と共有を分ける:自分だけの記憶(今の目的地など)は個別の黒板に、チームに伝えたいこと(敵の位置など)は共有の黒板に、と分けます。
  • 何でも入れない:黒板は便利なので、何でも放り込みがちです。誰が書き、誰が読むのかが追えなくなるので、キーごとに持ち主を決めます。

つまずきやすい点

  • 古い情報:時刻を持たせずに値だけを置くと、とっくに逃げた敵の位置へ全員が向かい続けます。
  • 全員が知りすぎる:共有の黒板をそのまま使うと、見えていないはずの敵の位置を全員が知っている「ずるい AI」になります。伝わるまでの遅れや、無線の届く範囲を設けると自然になります。
  • 書き込みの競合:複数の見張りが同じキーに同時に書くと、どちらが残るかが順番しだいになります。新しい時刻を優先する、確かさの高い方を優先する、などの規則を決めます。

デモで試すこと

  1. 4 人の見張りが、それぞれの部屋を巡回しています。緑の球(プレイヤー)を見つけた見張りが、黒板に「敵の位置」「見つけた人」を書き込みます(黄色の線)。右下の表で、黒板の中身と経過時間がわかります。
  2. ほかの見張りは黒板を読んで(青い線)駆けつけます。「担当 北」「担当 東」などの方向を黒板で取り合うので、同じ所に集まらず、取り囲むように動きます。
  3. 「見張りごとの記憶だけ」に切り替えると、見つけた見張りしか反応せず、ほかの見張りは巡回を続けます。
  4. 緑の球をドラッグして物陰に隠れると、時間がたつにつれて黒板の情報が古くなり、8 秒で警戒が解けて巡回に戻ります。

参考資料

Red Blob Games — A* Introduction ↗

分野全体の資料で、この項目を直接扱っているとは限りません。