feat(ai): 敌人感知↔状态模型——待机/警觉/追击/巡逻 + 可复用感知状态机
感知门面 EnemyBase.InChaseZone(追逐/aggro)/InVisionZone(视野/los,缺省回退aggro),纯查询; 转换逻辑归 AI 层: 新增可复用 PerceptionStateMachine(统一规则,HasAlert/视野缺省自动降级); 规则: 未发现进视野→警觉, 进追逐→追击(委托能力), 追击脱离视野→巡逻(永不回警觉,再进视野再警觉). EnemyStatsSO.HasAlertState 勾选项; ContactChaseAbility 改纯执行器(退出由AI中断); E001 用可复用件. PlayMode 验证四态转换全通过. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -297,6 +297,26 @@ namespace BaseGames.Enemies
|
||||
public virtual bool IsPlayerVisible()
|
||||
=> _threatAssessor != null ? _threatAssessor.IsThreatDetected : HasLineOfSight;
|
||||
|
||||
/// <summary>追逐感知:玩家是否在"追逐触发圆"(aggro 槽)内 → 触发追击。感知系统只回答"在不在",状态转换归 AI。</summary>
|
||||
public bool InChaseZone()
|
||||
=> _sensorHub != null && _playerTransform != null &&
|
||||
_sensorHub.IsDetecting(Perception.SensorSlotNames.Aggro, _playerTransform.gameObject);
|
||||
|
||||
/// <summary>
|
||||
/// 视野感知:玩家是否在视野(los/sight 槽)内。用于警觉升级与追击维持;
|
||||
/// 无视野槽时回退用追逐感知(aggro)。感知系统只回答"在不在",状态转换归 AI。
|
||||
/// </summary>
|
||||
public bool InVisionZone()
|
||||
{
|
||||
if (_sensorHub == null || _playerTransform == null) return false;
|
||||
bool hasVisionSlot = _sensorHub.HasSlot(Perception.SensorSlotNames.LOS)
|
||||
|| _sensorHub.HasSlot(Perception.SensorSlotNames.Sight);
|
||||
if (!hasVisionSlot) return InChaseZone(); // 缺省回退到追逐感知
|
||||
var go = _playerTransform.gameObject;
|
||||
return _sensorHub.IsDetecting(Perception.SensorSlotNames.LOS, go)
|
||||
|| _sensorHub.IsDetecting(Perception.SensorSlotNames.Sight, go);
|
||||
}
|
||||
|
||||
public virtual void FacePlayer()
|
||||
{
|
||||
if (_movement == null || _playerTransform == null) return;
|
||||
|
||||
Reference in New Issue
Block a user