diff --git a/Assets/Scripts/Mechanics/EnemyController.cs b/Assets/Scripts/Mechanics/EnemyController.cs index 942f57b..27909a2 100644 --- a/Assets/Scripts/Mechanics/EnemyController.cs +++ b/Assets/Scripts/Mechanics/EnemyController.cs @@ -27,12 +27,15 @@ namespace Platformer.Mechanics public float patrolMaxRange = 150f; public float patrolArriveThreshold = 0.5f; public float cliffCheckDistance = 0.6f; // 발 앞 절벽 검출 거리 - public float cliffCheckDepth = 0.8f; // 발 아래 Raycast 거리 - public LayerMask groundLayerMask = ~0; // 절벽 검출용 ground layer (default = 모든 layer) + public float cliffCheckDepth = 1.5f; // 발 아래 Raycast 거리 (BT81: 0.8→1.5 — 깊게 검출) + public LayerMask groundLayerMask = (1 << 0) | (1 << 16); // BT81: Layer 0 (지면) + Layer 16 (발판) — Enemy/Player 거짓 양성 차단 + public float stuckThresholdTime = 0.5f; // 벽 정지 검출 시간 (BT81) private float _startX; private float _targetX; private int _patrolPhase; // 0: right out / 1: right back / 2: left out / 3: left back + private float _lastX; // BT81: 벽 정지 검출용 + private float _stuckTimer; // BT81: 벽 정지 누적 시간 internal PatrolPath.Mover mover; // legacy 호환·미사용 internal AnimationController control; @@ -77,6 +80,8 @@ namespace Platformer.Mechanics // PD 명시 2026-05-08 — 자동 patrol 시작 위치 저장 + 첫 목표 설정 _startX = transform.position.x; + _lastX = _startX; + _stuckTimer = 0f; _patrolPhase = 0; SetNextPatrolTarget(); } @@ -107,6 +112,25 @@ namespace Platformer.Mechanics float moveDir = Mathf.Sign(dx); + // BT81 — 벽 정지 검출 (PD 보고 2026-05-08): 일정 시간 transform.x 변경 미세 시 = 벽 영역 → 다음 phase 강제 + if (Mathf.Abs(transform.position.x - _lastX) < 0.01f) + { + _stuckTimer += Time.deltaTime; + if (_stuckTimer > stuckThresholdTime) + { + _patrolPhase = (_patrolPhase + 1) % 4; + SetNextPatrolTarget(); + dx = _targetX - transform.position.x; + moveDir = Mathf.Sign(dx); + _stuckTimer = 0f; + } + } + else + { + _stuckTimer = 0f; + } + _lastX = transform.position.x; + // 절벽 검출 — 발 앞 영역 Raycast 지면 X 시 시작 위치로 즉시 복귀 if (Mathf.Abs(dx) > patrolArriveThreshold && _collider != null) {