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ᵢ)
陀螺狀態觸發逃跑逃跑期間權重
朝怪物接近/衝刺可以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ᵢ)

主軸的 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)
局面coherence輸出傾向
威脅集中同一側接近 165% 徑向+35% 側向
不對稱包夾介於 0~1連續內插,不瞬間切換
正對面等強包夾接近 0徑向自然歸零,側向接管

5. 每幀流程與穩定機制

01 偵測主動逼近者觸發;逃跑中納入所有 350px 內陀螺。
02 加權距離權重 × 速度因子,累加徑向與 covariance。
03 側逃求共享側逃軸,統一切向量方向後累加。
04 邊界預測出界則沿牆;貼邊則朝中央。
05 輸出設定速度;模型面向以角速度/角加速度限制平滑轉動。

6. 計算量與驗證邊界

項目成本/結果
威脅掃描O(N)
徑向與 covariance同一次掃描完成
切向累加第二次 O(N)
6P 上限約 12 次簡單向量累加+常數次 2×2 主軸計算
自動測試18 / 18 通過
Production build通過(僅既有 chunk-size warning)

已知限制:這是局部反應式 steering,不保證全域可達,也不會記憶死路。若場地未來出現迷宮或大型凹形障礙,才需要重新評估導航層;目前開放 arena 不需要引入尋路。

7. 理論來源