From cbde93a66da4af1624fad2df050651f9da653284 Mon Sep 17 00:00:00 2001 From: swrring Date: Fri, 8 May 2026 11:33:57 +0900 Subject: [PATCH] =?UTF-8?q?BT5-Dev=20#81:=20Enemy=20=EB=B2=BD=20=EC=A0=95?= =?UTF-8?q?=EC=A7=80=C2=B7=EB=82=AD=EB=96=A0=EB=9F=AC=EC=A7=80=20=EC=A0=95?= =?UTF-8?q?=EC=A0=95=20(PD=202=EA=B1=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PD 보고 (2026-05-08): 1. 벽에 닿은 후 멈춰있음 (이동 거리 미달 + 벽 충돌 → dx 영역 큰 값 잔존 → 영구 정지) 2. 낭떠러지 떨어짐 (절벽 검출 거짓 양성 또는 미검출) 진단: - 버그 1: BT80 코드는 dx 0.5초 시 = 벽 정지 → 다음 phase 강제 2. groundLayerMask: ~0 → (1 << 0) | (1 << 16) — Layer 0 (지면) + Layer 16 (발판)만 3. cliffCheckDepth: 0.8 → 1.5 — 지면 검출 깊이 증가 4. Inspector 노출: stuckThresholdTime 신규 (기본 0.5초) 효과: - 벽 정지 시 0.5초 후 자동 phase 전환 (다음 patrol 방향 시도) - 절벽 검출 = Layer 0/16만 = Enemy/Player 거짓 양성 차단 - 시작 위치 복귀 영역 그대로 후속 의무: - PD Refresh+Play 시각 검증 --- Assets/Scripts/Mechanics/EnemyController.cs | 28 +++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) 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) {