game-ai
核心哲學
遊戲人工智慧(Game AI)並非學術界的機器學習,試圖預測未來或擊敗西洋棋大師。遊戲AI是一種娛樂與節奏感的幻象。一個以超人級精度、像素級瞄準、零猶豫表現的NPC,只會讓玩家感到挫折且毫無樂趣。遊戲AI必須提供清晰的意圖提示、可讀的戰術決策、可信的感官感知,以及動態難度調整,讓玩家產生智勝對手的興奮感。
4步驟遊戲AI架構
步驟 1:決策架構:行為樹 vs 有限狀態機
- 行為樹(戰鬥AI的業界標準):
- 基於由左至右評估的階層式節點:
- 複合節點:
- 序列($ o$):依序執行子節點;任一子節點失敗即中斷(例如 有武器 $ o$ 裝彈 $ o$ 瞄準)。
- 選擇器($?$):執行子節點直到其中一個成功(例如 血量低則逃脫 $?$ 近戰攻擊 $?$ 尋找掩體)。
- 修飾節點:條件判斷閘(例如 反轉、時間限制、冷卻時間)。
- 葉節點/任務:具體的可執行動作(例如 MoveToPosition、PlayAnimation)。
- 複合節點:
- 基於由左至右評估的階層式節點:
- 有限狀態機(FSM):
- 最適合簡單的環境生物或階段式頭目(狀態:巡邏、調查、追逐、攻擊、逃脫)。
步驟 2:感官感知系統(視覺與聽覺)
- 視覺錐(視覺感知):
- 透過三道閘門評估目標可見性:
- 距離檢查:玩家是否在視線半徑內($D \le R_{text{max}}$)?
- 視野角度:敵方前向量與朝向玩家方向之間的点積是否 $\ge \cos( heta / 2)$?
- 視線(射線檢測):從敵方眼睛到玩家軀幹的物理射線檢測是否擊中世界幾何體或玩家?
- 透過三道閘門評估目標可見性:
- 聽覺感知(聽覺):
- 將聲音事件傳播到遊戲世界中(例如 槍聲 = 40公尺半徑;腳步聲 = 8公尺半徑)。
- 被驚動的NPC轉為調查狀態,並朝向聲音來源移動。
步驟 3:NavMesh尋路與戰術側翼包抄
- 基於導航網格的A*尋路:
- NPC查詢預先計算的NavMesh進行路徑移動。
- 互補速度障礙(RVO / ORCA):實作局部碰撞避免,使5個敵人群不會以完全相同的一列行進,或卡在門口入口。
- 戰術掩體尋找與側翼包抄:
- 查詢環境查詢系統(EQS):採樣玩家周圍的候選點,根據掩體幾何角度、距離和視線保護進行評分。
步驟 4:意圖提示與能力幻象
- 意圖提示:
- 在執行致命攻擊之前,NPC必須透過音效提示(「左側包抄!」、「手榴彈! 」)、預備動作動畫或雷射瞄準線來提示意圖。
- 「風暴兵效應」(可控的不準確):
- 針對未察覺玩家的第一槍應故意偏離1公尺,以警示玩家並在造成真實傷害前製造腎上腺素。
可交付格式:敵人AI行為樹規格(ENEMY-AI-SPEC.md)
# 戰鬥敵人AI行為樹規格:[NPC 原型]
## 1. 感知參數
- **視線距離**:25公尺(白天)/ 14公尺(夜晚)
- **視野角度**:110度
- **聽覺半徑**:槍聲 = 50公尺 | 跑步腳步聲 = 12公尺 | 蹲伏行走 = 0公尺(無聲)
- **反應時間緩衝**:目標鎖定到觸發攻擊之間延遲350毫秒
## 2. 主行為樹階層
Root (Selector) ├── [Decorator: Health < 20%] -> Sequence (Emergency Flee) │ ├── FindCoverAwayFromPlayer() │ ├── MoveToCover() │ └── PlayAnimation("Heal") ├── [Decorator: CanSeePlayer == True] -> Selector (Combat Branch) │ ├── [Decorator: InMeleeRange] -> Sequence (Melee Strike) │ │ ├── PlayAudioBark("Charge!") │ │ ├── TelegraphWindup(400ms) │ │ └── ExecuteMeleeDamage() │ └── Sequence (Ranged Engagement) │ ├── Selector (Take Cover or Flank) │ │ ├── [Decorator: InCover] -> AimAtPlayer() │ │ └── MoveToFlankPosition() │ └── FireBurst(3_rounds) └── Sequence (Patrol / Idle) ├── PickNextPatrolWaypoint() ├── MoveToWaypoint() └── WaitRandom(2s, 5s)
## 3. 音效叫喊與玩家回饋
- **發現玩家時**:*「接觸!九點鐘方向!」*
- **投擲手榴彈時**:*「破片彈!找掩護!」*
實戰範例:修正「不公平」的狙擊手敵人AI
- 問題:測試玩家討厭某個狙擊手敵人,因為它會在沒有預警的情況下秒殺地圖另一端的玩家。
- 修正:在開火前加入一條可見的紅色雷射瞄準線橫掃地面2.0秒,並搭配獨特的音效充能嗡鳴聲。
- 結果:玩家的死亡感覺公平且可避免;測試滿意度分數從32%躍升至88%。
驗證檢查清單
- 感知系統驗證距離、視野錐與物理射線檢測視線。
- 行為樹在進攻行動之前優先處理生存/逃脫狀態。
- 所有致命攻擊都包含可讀的提示動畫或音效叫喊。
- NavMesh代理實作局部避免(RVO)以防止門口擁擠。
- 敵人反應時間包含合理的人類延遲緩衝(200–400毫秒)。
反模式
- 全知AI:讓敵人無須感知檢查就能穿牆得知玩家座標。
- 零幀轉向:敵人在一幀內180度轉向並以100%精度射擊。
- 單線行軍:讓8個敵人排成一列穿過單一走廊,被逐個擊殺。