From 7b484757e9c5d6c7d7f41c2c7dbf61ba56e6ec9a Mon Sep 17 00:00:00 2001 From: swrring Date: Fri, 8 May 2026 12:52:08 +0900 Subject: [PATCH] =?UTF-8?q?BT5-Dev=20#92:=20stuckTimer=200.3=C2=B7cliff=20?= =?UTF-8?q?1.0=C2=B7transform=20safe=20push=20(=EC=A2=8C=EC=9A=B0=20?= =?UTF-8?q?=EB=B0=98=EB=B3=B5=C2=B7=EB=82=AD=EB=96=A0=EB=9F=AC=EC=A7=80=20?= =?UTF-8?q?=EC=B0=A8=EB=8B=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PD 보고 (2026-05-08): 1) 벽 가장자리 좌우 반복 / 2) 낭떠러지 돌진 떨어짐 진단: - 좌우 반복: stuckTimer 50ms 영역이 phase 전환 직후 1 frame 정지를 정지로 인식 → 매번 트리거 → 부들부들 - 낭떠러지: cliffCheckDistance 0.8m + 1 frame 지연으로 발 영역 절벽 진입 → KinematicObject 영역 발 아래 충돌 X → gravity 떨어짐 정정 (BT92): 1. stuckThresholdTime: 0.05 → 0.3 (300ms — phase 전환 직후 미세 정지 영역 무시) 2. cliffCheckDistance: 0.8 → 1.0 (1m 일찍 검출) 3. cliffSafePushDistance Inspector 영역 신규 (기본 0.15m) 4. 절벽 검출 시: transform.position += (-moveDir * 0.15m) 즉시 안전 영역 push - 1 frame 지연 영역에서 발 영역 절벽 진입 차단 - 이후 phase+2 + control.move.x = 반대 방향 효과: - 벽 가장자리 = stuckTimer 300ms 임계값 → phase 전환 후 안정 → 좌우 반복 X - 절벽 영역 = 1m 앞 검출 + transform 즉시 안전 push → 발 영역 절벽 X → 떨어짐 X - arrive·일반 patrol 영역 그대로 --- Assets/Scripts/Mechanics/EnemyController.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Assets/Scripts/Mechanics/EnemyController.cs b/Assets/Scripts/Mechanics/EnemyController.cs index 86fd716..ed3095d 100644 --- a/Assets/Scripts/Mechanics/EnemyController.cs +++ b/Assets/Scripts/Mechanics/EnemyController.cs @@ -26,11 +26,12 @@ namespace Platformer.Mechanics public float patrolMinRange = 50f; public float patrolMaxRange = 75f; public float patrolArriveThreshold = 0.5f; - public float cliffCheckDistance = 0.8f; // BT91: 0.3→0.8 — 더 일찍 검출 (Enemy 이동 속도 대비 충분한 영역) - public float cliffCheckDepth = 2.0f; // BT91: 1.5→2.0 — 더 깊게 검출 + public float cliffCheckDistance = 1.0f; // BT92: 0.8→1.0 — 더 일찍 검출 + public float cliffCheckDepth = 2.0f; public LayerMask groundLayerMask = (1 << 0) | (1 << 16); // Layer 0 (지면) + Layer 16 (발판) - public float stuckThresholdTime = 0.05f; // BT90: 0.1→0.05 (50ms·거의 즉시) - public float stuckMoveThreshold = 0.02f; // 정지 판정 거리 임계값 (미세 밀림 검출) + public float stuckThresholdTime = 0.3f; // BT92: 0.05→0.3 — phase 전환 직후 미세 정지 영역 무시 (좌우 반복 차단) + public float stuckMoveThreshold = 0.02f; // 정지 판정 거리 임계값 + public float cliffSafePushDistance = 0.15f; // BT92: 절벽 검출 시 안전 영역 push 거리 public float waitMinTime = 1f; // patrol arrive·벽·절벽 후 대기 random 영역 public float waitMaxTime = 3f; @@ -134,7 +135,7 @@ namespace Platformer.Mechanics // BT90 — 수평 Raycast 영역 폐기 (BT89 거짓 양성 — 같은 Tile cell 영역 검출) // 벽 영역 = stuckTimer 영역 (50ms 정지 시 즉시 phase+2)으로 처리 - // BT91 — 절벽 검출: 즉시 반대 방향 이동 (waitTimer X — 정지 시 절벽 떨어짐) + // BT92 — 절벽 검출: 즉시 반대 방향 + transform 안전 push (1 frame 지연 영역에서 발 영역 절벽 진입 차단) if (_collider != null) { Vector2 footAhead = new Vector2( @@ -144,6 +145,7 @@ namespace Platformer.Mechanics RaycastHit2D groundHit = Physics2D.Raycast(footAhead, Vector2.down, cliffCheckDepth, groundLayerMask); if (groundHit.collider == null) { + transform.position += new Vector3(-moveDir * cliffSafePushDistance, 0f, 0f); _patrolPhase = (_patrolPhase + 2) % 4; SetNextPatrolTarget(); _stuckTimer = 0f;