diff --git a/Assets/Prefabs/Enemy.prefab b/Assets/Prefabs/Enemy.prefab index 31c6483..483dd80 100644 --- a/Assets/Prefabs/Enemy.prefab +++ b/Assets/Prefabs/Enemy.prefab @@ -200,7 +200,7 @@ MonoBehaviour: minGroundNormalY: 0.65 gravityModifier: 1 velocity: {x: 0, y: 0} - maxSpeed: 7 + maxSpeed: 3.5 jumpTakeOffSpeed: 7 move: {x: 0, y: 0} jump: 0 diff --git a/Assets/Scripts/Mechanics/EnemyController.cs b/Assets/Scripts/Mechanics/EnemyController.cs index a7fc3f4..fb6a720 100644 --- a/Assets/Scripts/Mechanics/EnemyController.cs +++ b/Assets/Scripts/Mechanics/EnemyController.cs @@ -26,10 +26,11 @@ namespace Platformer.Mechanics public float patrolMinRange = 100f; public float patrolMaxRange = 150f; public float patrolArriveThreshold = 0.5f; - public float cliffCheckDistance = 0.6f; // 발 앞 절벽 검출 거리 - 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; // 벽 정지 검출 시간 (BT85: 0.3→0.5 — 정상 이동 미세 영역 거짓 양성 차단) + public float cliffCheckDistance = 0.3f; // 발 앞 절벽 검출 거리 (BT86: 0.6→0.3 — 더 빠른 검출·낭떠러지 근처 Enemy 보호) + public float cliffCheckDepth = 1.5f; // 발 아래 Raycast 거리 + public LayerMask groundLayerMask = (1 << 0) | (1 << 16); // Layer 0 (지면) + Layer 16 (발판) + public float stuckThresholdTime = 0.3f; // 벽 정지 검출 시간 (BT86: 0.5→0.3 — 빠른 영역 전환) + public float stuckMoveThreshold = 0.02f; // BT86: 정지 판정 거리 임계값 (0.01→0.02 — 미세 밀림 검출) private float _startX; private float _targetX; @@ -112,8 +113,8 @@ 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) + // BT86 — 벽 정지·미세 밀림 검출 (PD 보고 2026-05-08): 임계값 거리 0.01→0.02 — 미세 밀림도 정지 인식 + if (Mathf.Abs(transform.position.x - _lastX) < stuckMoveThreshold) { _stuckTimer += Time.deltaTime; if (_stuckTimer > stuckThresholdTime) @@ -135,7 +136,9 @@ namespace Platformer.Mechanics // BT83/BT84 영역 = bounds 외부+0.5m 영역도 옆 Tile (평지 인접) 검출 → 거짓 양성 → patrol X // 정정: 수평 Raycast 폐기 + stuckTimer 영역 0.5초 (BT81 영역 회복) — 벽 정지 시 다음 phase - // 절벽 검출 — 발 앞 영역 Raycast 지면 X 시 시작 위치로 즉시 복귀 + // BT86 — 절벽 검출 (PD 보고 2026-05-08): 시작 위치 복귀 폐기·즉시 다음 phase 강제 + // 시작 위치도 절벽 가능 (낭떠러지 근처 생성 Enemy) → 시작 위치 복귀 시 떨어짐 + // 정정: 다음 phase 강제 = 반대 방향 patrol 시도 if (Mathf.Abs(dx) > patrolArriveThreshold && _collider != null) { Vector2 footAhead = new Vector2( @@ -145,11 +148,11 @@ namespace Platformer.Mechanics RaycastHit2D groundHit = Physics2D.Raycast(footAhead, Vector2.down, cliffCheckDepth, groundLayerMask); if (groundHit.collider == null) { - // 절벽 영역 → 시작 위치 즉시 복귀 (반대 방향 phase 강제) - _patrolPhase = (_patrolPhase % 2 == 0) ? _patrolPhase + 1 : _patrolPhase; - _targetX = _startX; + _patrolPhase = (_patrolPhase + 1) % 4; + SetNextPatrolTarget(); dx = _targetX - transform.position.x; moveDir = Mathf.Sign(dx); + _stuckTimer = 0f; } }