GAME AI · LOCAL STEERING · 2026-09-16
炸彈怪逃離行為算法
以局部資訊即時反應,不使用 A*、NavMesh 或全域路徑搜尋。核心是「徑向排斥+同側切向流」,用 O(N) 成本處理單一威脅、多人包夾、靜止陀螺與場地邊界。
350 px威脅警戒半徑
0.5 s方向意圖最短鎖定
O(N)每次重評估成本
18 / 18focused tests
1. 為什麼不用尋路
戰場開放、威脅持續移動,需求是短時間內做出可信的閃避,而不是找到全域最短路徑。
FLEE徑向逃離
每顆陀螺把怪物往反方向推;越近、越快接近,推力越強。
ROTATE切向繞行
把威脅的側向量統一到同一逃離側,包夾時不會一起抵消。
WALL邊界優先
預測出界時切換沿牆方向;已貼邊則直接朝場中央脫困。
2. 單顆陀螺如何產生力量
速度只調整權重,不改變幾何方向;逃跑期間,完全靜止的陀螺也會參與。
awayᵢ = normalize(monster − topᵢ)
distanceWeightᵢ = max(0.05, (350 − distanceᵢ) / 350)
motionFactorᵢ = approaching ? (1 + min(0.5, approachSpeed / 500)) : departing ? 0.6 : 1.0
weightᵢ = distanceWeightᵢ × motionFactorᵢ
radial = Σ(awayᵢ × weightᵢ)
distanceWeightᵢ = max(0.05, (350 − distanceᵢ) / 350)
motionFactorᵢ = approaching ? (1 + min(0.5, approachSpeed / 500)) : departing ? 0.6 : 1.0
weightᵢ = distanceWeightᵢ × motionFactorᵢ
radial = Σ(awayᵢ × weightᵢ)
| 陀螺狀態 | 觸發逃跑 | 逃跑期間權重 |
|---|---|---|
| 朝怪物接近/衝刺 | 可以 | 1.0~1.5 × distanceWeight |
| 完全靜止/橫向移動 | 單獨不觸發 | 1.0 × distanceWeight |
| 正在遠離怪物 | 通常不觸發;近身操作仍視為威脅 | 0.6 × distanceWeight |
3. 包夾時為什麼改走側面
單純將每個反向量旋轉 90° 仍會互相抵消,因此必須先建立共享的側逃軸。
C = Σ(weightᵢ × [awayᵢ.x², awayᵢ.x·awayᵢ.y; awayᵢ.x·awayᵢ.y, awayᵢ.y²])
pressureAxis = principalAxis(C)
sharedSide = perpendicular(pressureAxis) × persistentSideSign
lateral = Σ(align(perpendicular(awayᵢ), sharedSide) × weightᵢ)
pressureAxis = principalAxis(C)
sharedSide = perpendicular(pressureAxis) × persistentSideSign
lateral = Σ(align(perpendicular(awayᵢ), sharedSide) × weightᵢ)
主軸的 v 與 −v 代表同一條線。實作會把主軸固定對齊徑向合力,避免單一威脅跨過 ±90° 時側逃方向翻轉、造成來回震盪。
4. 徑向與側向如何混合
利用徑向一致性自動判斷「威脅集中在同側」或「正在被包夾」。
coherence = clamp(length(radial) / Σweightᵢ, 0, 1)
radialWeight = 0.65 × coherence
lateralWeight = 0.35 + 0.65 × (1 − coherence)
escape = normalize(radialDir × radialWeight + lateralDir × lateralWeight)
radialWeight = 0.65 × coherence
lateralWeight = 0.35 + 0.65 × (1 − coherence)
escape = normalize(radialDir × radialWeight + lateralDir × lateralWeight)
| 局面 | coherence | 輸出傾向 |
|---|---|---|
| 威脅集中同一側 | 接近 1 | 65% 徑向+35% 側向 |
| 不對稱包夾 | 介於 0~1 | 連續內插,不瞬間切換 |
| 正對面等強包夾 | 接近 0 | 徑向自然歸零,側向接管 |
5. 每幀流程與穩定機制
01 偵測主動逼近者觸發;逃跑中納入所有 350px 內陀螺。
02 加權距離權重 × 速度因子,累加徑向與 covariance。
03 側逃求共享側逃軸,統一切向量方向後累加。
04 邊界預測出界則沿牆;貼邊則朝中央。
05 輸出設定速度;模型面向以角速度/角加速度限制平滑轉動。
- 0.5 秒意圖鎖定:威脅數量不變時避免反覆換向。
- 數量變化立即重算:警戒範圍的陀螺增加或減少,不等待 0.5 秒。
- 2.5 秒逃跑狀態:主動威脅觸發後維持最低逃跑時間;歷史威脅不會每幀把時間補滿。
- 200°/s 轉向上限:限制模型瞬間翻面;移動方向與模型面向分開處理。
6. 計算量與驗證邊界
| 項目 | 成本/結果 |
|---|---|
| 威脅掃描 | O(N) |
| 徑向與 covariance | 同一次掃描完成 |
| 切向累加 | 第二次 O(N) |
| 6P 上限 | 約 12 次簡單向量累加+常數次 2×2 主軸計算 |
| 自動測試 | 18 / 18 通過 |
| Production build | 通過(僅既有 chunk-size warning) |
已知限制:這是局部反應式 steering,不保證全域可達,也不會記憶死路。若場地未來出現迷宮或大型凹形障礙,才需要重新評估導航層;目前開放 arena 不需要引入尋路。
7. 理論來源
- Craig Reynolds — Steering Behaviors For Autonomous Characters:Flee、Separation、Obstacle Avoidance 與局部反應式操控。
- Artificial Intelligence for Games:Weighted Blending、Priorities、Collision/Wall Avoidance。
- Rotational Potential Field:在排斥力之外加入切向旋轉力,以降低局部停滯。