ゲームAI
核となる思想
ゲーム人工知能(AI)は、未来を予測したり人間のチェスグランドマスターに勝ったりする学術的な機械学習ではありません。ゲームAIとは、エンターテインメントとテンポ調整のための錯覚です。超人的な精度、ピクセル単位の狙い、一瞬の躊躇もなく行動するNPCは、対戦相手としてイライラさせられ、楽しくありません。ゲームAIは、明確な予告、読みやすい戦術的判断、信頼性のある感覚知覚、そして動的な難易度調整を提供し、プレイヤーに「有能な敵を出し抜いた」というスリルを感じさせるものでなければなりません。
4段階のゲームAIアーキテクチャ
ステップ1:意思決定アーキテクチャ:ビヘイビアツリー vs FSM
- ビヘイビアツリー(戦闘AIの業界標準):
- 階層的なノードを左から右に評価する構造:
- コンポジットノード:
- シーケンス($ o$):子ノードを順次実行。いずれかの子が失敗すると失敗(例:武器所持 $ o$ リロード $ o$ 照準)。
- セレクター($?$):子ノードのいずれかが成功するまで実行(例:体力低なら逃走 $?$ 近接攻撃 $?$ カバーを探す)。
- デコレーター:条件付きゲート(例:反転、時間制限、クールダウン)。
- リーフ / タスク:具体的な実行可能なアクション(例:MoveToPosition、PlayAnimation)。
- コンポジットノード:
- 階層的なノードを左から右に評価する構造:
- 有限状態マシン(FSM):
- 単純な環境生物や個別のボスに最適(状態:巡回、調査、追跡、攻撃、逃走)。
ステップ2:感覚知覚システム(視覚と聴覚)
- 視野円錐(視覚知覚):
- 3つのゲートを使用してターゲットの可視性を評価:
- 距離チェック:プレイヤーが視界半径内にいるか($D \le R_{text{max}}$)。
- 視野角:敵の前方ベクトルとプレイヤー方向へのベクトルの内積が $\ge \cos(\theta / 2)$ か。
- 視線(レイキャスト):敵の目からプレイヤーの胴体への物理レイキャストがワールドジオメトリかプレイヤーに当たるか。
- 3つのゲートを使用してターゲットの可視性を評価:
- 聴覚知覚(聴覚):
- サウンドイベントをゲームワールドに伝播(例:銃声=半径40m、足音=半径8m)。
- 警戒したNPCは、音源方向に向かって調査状態に遷移。
ステップ3:ナビメッシュ経路探索と戦術的な側面攻撃
- ナビゲーションメッシュ上のA*経路探索:
- NPCは事前に焼かれたナビメッシュを照会して経路を移動。
- RVO(相互速度障害物)/ ORCA:局所的な衝突回避を実装し、5体の敵グループが一列に並んで行進したり、出入り口で詰まったりするのを防止。
- 戦術的なカバー発見と側面攻撃:
- EQS(環境クエリシステム)を利用:プレイヤー周辺の候補点をサンプリングし、カバージオメトリの角度、距離、視線保護に基づいて点数付け。
ステップ4:予告演出と有能感の錯覚
- 意図の予告:
- 致命攻撃を実行する前に、NPCは音声合図(「左から回り込む!」「グレネードだ!」)、予備動作アニメーション、レーザー照準線などを通じて意図を予告しなければならない。
- 「ストームトルーパー効果」(制御された無能):
- 気づいていないプレイヤーに対する最初の射撃は、意図的に1メートル外し、プレイヤーに警告を与え、実際のダメージを与える前にアドレナリンを分泌させるべき。
成果物フォーマット:敵AIビヘイビアツリー仕様書(ENEMY-AI-SPEC.md)
# 戦闘敵AIビヘイビアツリー仕様書:[NPCアーキタイプ]
## 1. 知覚パラメータ
- **視覚距離**:25メートル(昼)/ 14メートル(夜)
- **視野角**:110度
- **聴覚半径**:銃声=50m | 走る足音=12m | しゃがみ歩き=0m(無音)
- **反応時間バッファ**:ターゲット捕捉から攻撃トリガーまで350msの遅延
## 2. マスタービヘイビアツリー階層
Root (Selector) ├── [Decorator: Health < 20%] -> Sequence (緊急逃走) │ ├── FindCoverAwayFromPlayer() │ ├── MoveToCover() │ └── PlayAnimation("Heal") ├── [Decorator: CanSeePlayer == True] -> Selector (戦闘ブランチ) │ ├── [Decorator: InMeleeRange] -> Sequence (近接攻撃) │ │ ├── PlayAudioBark("突撃!") │ │ ├── TelegraphWindup(400ms) │ │ └── ExecuteMeleeDamage() │ └── Sequence (遠距離交戦) │ ├── Selector (カバーか側面攻撃) │ │ ├── [Decorator: InCover] -> AimAtPlayer() │ │ └── MoveToFlankPosition() │ └── FireBurst(3_rounds) └── Sequence (巡回 / 待機) ├── PickNextPatrolWaypoint() ├── MoveToWaypoint() └── WaitRandom(2s, 5s)
## 3. 音声バークとプレイヤーへのフィードバック
- **プレイヤー発見時**:*「敵影!9時の方向!」*
- **グレネード投擲時**:*「榴弾だ!伏せろ!」*
実例:"不公平"なスナイパー敵AIの修正
- 問題:プレイテスターは、マップの反対側からプレイヤーを即死させるスナイパー敵を嫌った。
- 対策:発射前に2.0秒間、地面を掃く可視赤色レーザー照準線と、それに合わせた明確なチャージアップ音を追加。
- 結果:プレイヤーの死亡は「公平で回避可能」と感じられ、プレイテスト満足度スコアが32%から88%に向上。
検証チェックリスト
- 知覚システムが距離、視野円錐、物理レイキャスト視線を検証している。
- ビヘイビアツリーが攻撃行動よりも生存/逃走状態を優先している。
- すべての致死攻撃に読みやすい予告アニメーションまたは音声バークが含まれている。
- ナビメッシュエージェントが局所回避(RVO)を実装し、出入り口の混雑を防止している。
- 敵の反応時間に現実的な人間のような遅延バッファ(200~400ms)が含まれている。
アンチパターン
- 全知のAI:知覚チェックなしに、敵がプレイヤーの座標を壁越しに知ることができること。
- フレームゼロでの反応:敵が180度回転し、1フレームで100%の精度で射撃すること。
- 一列レミング:8体の敵が一本の廊下を一列に進み、一匹ずつ屠られること。