PD 보고 (2026-05-08):
1. 몬스터 바닥 뚫고 나옴 (이미지 첨부)
2. 몬스터 여전히 이동 X
진단:
- 버그 1: sprite 발 영역(transform.y - 0.63·sprite half) ↔ Capsule bounds.min.y(transform.y - 0.39) = 0.24m 차이. Capsule 영역 위 Tile 표면 → sprite 영역 발이 0.24m 침투 → 시각상 침투
- 버그 2: BT83/BT84 수평 벽 Raycast 영역(bounds 외부 + 0.5m)도 옆 Tile (평지 인접) 검출 → 거짓 양성 → 매 frame phase 강제 → 모든 Enemy 정지
정정 (BT85):
1. transform.y 추가 +0.3 (Enemy.prefab 1.532→1.832 + Scene 인스턴스 19건 +0.3)
2. EnemyController.cs:
- 수평 벽 Raycast (BT83/BT84 영역) 폐기
- wallCheckDistance Inspector 영역 폐기
- stuckThresholdTime: 0.3→0.5 (BT81 영역 회복·정상 이동 미세 영역 거짓 양성 차단)
- 절벽 검출 영역 그대로
- stuckTimer 영역 그대로 (벽 정지 시 0.5초 후 다음 phase 강제)
효과:
- 시각상 발 영역 침투 X (transform.y +0.3 → 총 +0.8 from 원본)
- 정상 patrol 영역 = stuckTimer 영역 0 (frame당 transform.x 변경 큰 영역)
- 벽 영역 정지 시 = stuckTimer 영역 0.5초 누적 → 다음 phase 강제
- 절벽 영역 = footAhead Raycast 영역 (Layer 0+16) 검출 → 시작 위치 복귀
후속 의무:
- PD Refresh+Play 시각 검증
PD 보고 (2026-05-08): "이제는 모든 몬스터가 이동(순찰 패턴)하지 않고 있어"
근본 원인:
- BT83 wallOrigin = bounds.center.x + moveDir * 0.05 = Capsule bounds 내부
- Enemy가 Foreground Tile 위 영역에 서있을 때 = 인접 Tile (같은 Layer 16) Raycast 검출
- = 거짓 양성 → 즉시 다음 phase 강제 → 매 frame 반복 → patrol X
정정 (BT84):
- wallOrigin.x = bounds.center.x + moveDir * (halfWidth + 0.05f)
- = Capsule bounds 외부 영역 시작 → 자기 영역(또는 같은 Tile) 검출 X
- 절벽 검출 영역 그대로 (footAhead 영역은 발 앞 cliffCheckDistance·다른 영역)
효과:
- Enemy 영역 자기 검출 X = 거짓 양성 차단
- 벽 영역 정상 검출 (외부 영역만)
- patrol 정상 작동
후속 의무:
- PD Refresh+Play 시각 검증
PD 보고 (2026-05-08): "몬스터가 벽 가장자리에서 이동하지 못하게 되면 밀려나면서 결국 낭떠러지로 떨어지고 있어"
진단:
- 벽 가장자리 정지 시 미세 밀림(< 0.01 영역) → stuckTimer 누적 X
- 다음 phase 전환 X → 미세 밀림 누적 → 결국 절벽 영역 도달 → 떨어짐
- BT81 stuckTimer 영역만으로 부족 (정지 임계값 0.01 미달 미세 밀림 미감지)
정정 (BT83):
1. wallCheckDistance 영역 신규 (Inspector 노출·기본 0.5)
2. 수평 벽 Raycast 검출 추가:
- 발 영역 horizontal (moveDir 방향) Raycast Layer 0+16
- 벽 검출 시 즉시 다음 phase 강제 (stuckTimer 영역과 분리)
3. stuckThresholdTime: 0.5 → 0.3 (빠른 영역 전환)
효과:
- 벽 영역 즉시 검출 + 다음 phase = 정지·밀림 영역 도달 X
- 절벽 영역 도달 X = 떨어짐 차단
- stuckTimer 영역 = 보조 (벽 검출 + 미감지 fallback)
후속 의무:
- PD Refresh+Play 시각 검증
PD 보고 (2026-05-08):
1. 벽에 닿은 후 멈춰있음 (이동 거리 미달 + 벽 충돌 → dx 영역 큰 값 잔존 → 영구 정지)
2. 낭떠러지 떨어짐 (절벽 검출 거짓 양성 또는 미검출)
진단:
- 버그 1: BT80 코드는 dx<arriveThreshold 시점만 다음 phase. 벽 충돌 시 KinematicObject body.Cast 차단 → transform.x 정지 → dx 영역 잔존 → phase 전환 X
- 버그 2: groundLayerMask=~0 (모든 layer) = Enemy/Player Collider 거짓 양성 → 절벽 영역 미검출
정정 (BT81):
1. stuckTimer 영역 신규:
- _lastX·_stuckTimer 추가
- 매 frame |transform.x - _lastX| < 0.01 시 _stuckTimer 누적
- _stuckTimer > 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 시각 검증
PD 명시 (2026-05-08):
1. 몬스터 바닥 살짝 뚫고 들어감 → y +0.5 (Enemy.prefab + Scene 인스턴스)
2. PatrolPath 폐기 → 생성 위치 기준 좌/우 random 100~150 왕복 자동 patrol
3. 절벽 검출 → 낭떠러지 떨어지지 않도록
변경:
1. Enemy.prefab transform.y: 1.032 → 1.532
2. Scene Ingame.unity Enemy 인스턴스 16개 m_LocalPosition.y override 영역 +0.5 일괄 (19건)
3. EnemyController.cs:
- patrol 4-phase 영역 (0: 우측 random / 1: 시작 복귀 / 2: 좌측 random / 3: 시작 복귀)
- SetNextPatrolTarget — Random.Range(100, 150) 영역 + phase별 _targetX 계산
- Update 영역 자동 patrol 로직 (PatrolPath path 영역 폐기·legacy 호환만)
- 절벽 검출 — 발 앞 0.6 + 발 아래 0.8 Raycast 영역 지면 X 시 시작 위치 즉시 복귀
- Inspector 노출: patrolMinRange·patrolMaxRange·patrolArriveThreshold·cliffCheckDistance·cliffCheckDepth·groundLayerMask
- BT17 marker Debug.Log 영역 폐기 (시행착오 정리)
효과:
- 모든 Enemy 인스턴스 (path 미설정 영역 포함) 자동 patrol 작동
- 시작 위치 기준 ±100~150 random 왕복 패턴
- 절벽 영역 검출 시 시작 위치 즉시 복귀 (낭떠러지 X)
- y +0.5 = 발 영역 지면 위 정합
PD 보고: 몬스터와 충돌 체크 X 통과 발생 — '충돌 로직 바꿔야'
자인:
- Distance 기반(hitRangeX=0.7, hitRangeY=1.0) = 빠른 통과 시 한 프레임 안 진입·이탈 = miss
- 표준 = Unity Physics Bounds.Intersects (AABB 정확)
정정:
- VisualBounds.Intersects(player.Bounds) — Enemy SpriteRenderer 영역 + Player Collider 영역 AABB 교차
- Layer 13↔14 OFF 영역 통과 가능 영역 그대로 (충돌 영역 무관)
- 시각 영역 보정(PLAYER_COLLIDER_TO_VISUAL_FOOT -0.17) 영역 그대로
- 빠른 통과 영역도 매 프레임 Bounds 교차 1회는 catch 정합
동작:
- Player가 Enemy 영역 통과 시 → Bounds 교차 시점 Schedule<PlayerEnemyCollision>
- 점프 상태(공중) 측면 → 피해 차단(BT35)
- 점프 후 머리 영역 → 밟기
PD 의도 정확 분석:
1. 발판 통과 = 발판 아래에서 위로 점프 시 막히지 않고 통과 (One-Way Platform)
2. 밟기 위치 = Player 시각 발이 Enemy 시각 머리 정확히 닿음
본 PM 자인:
- BT5-Dev #25부터 dyAtCollision = Player Collider 발 vs Enemy SpriteRenderer 머리 (시각 영역 보정 X)
- Player Collider Offset y +0.10 → Player Collider 발이 시각 발보다 0.17 위
- Enemy sprite 위 여백 ≈ 0 (EnemyIdle.png 동그란 sprite 영역)
- 시각 영역 정합 보정 미적용 = PD '여전히 떨어져있어' 보고 정합
정정:
- EnemyController.Update: footY = Bounds.min.y + (-0.17) → 시각 발 영역 보정
- PlayerEnemyCollision: STOMP_DELTA -0.4~-0.05 → -0.3~+0.05 (시각 영역 0 근처)
- PlayerController.OnCollisionEnter2D 진단 로그 — 발판 GameObject 영역 식별 (PD 영역 부딪힘 시 [BT30-Collide] 출력)
발판 영역 후속:
- PD가 발판 영역 부딪힐 때 Editor Console에 [BT30-Collide] name='?' layer=N 출력
- 본 PM이 직접 Editor.log read해서 발판 GameObject 영역 식별 + Layer 8 변환 의무
PD 보고:
1. 점프 밟기 위치 너무 높음 — dyAtCollision = transform 차 (center vs center) 영역 잘못
2. 발판 통과 X — Tilemap OneWay 영역 적용 = 모든 Tile 영역 OneWay = 일반 지면 영역 깨짐
정정:
- EnemyController.Update: dyAtCollision = Player.Bounds.min.y - Enemy.VisualBounds.max.y (footHeadDelta)
- PlayerEnemyCollision: stomped = (-0.2 < delta < 0.3) — Player 발 ≈ Enemy 머리 영역
- GameOptimizer: TilemapCollider2D 영역 영역 OneWay 영역 영역 폐기 → 별개 BoxCollider2D 영역 OneWay (Alien 등 점프 가능 발판 영역 영역만)
본 PM이 외부 영역에서 변경한 BT5-Dev 모든 영역을 EerieVillage git에 반영:
- EnemyController.cs (Distance 기반 감지·VisualBounds·IgnoreCollision·Bounds)
- PlayerEnemyCollision.cs (dyAtCollision·stomped 판정)
- PlayerController.cs (LastGroundedPosition·OnHealthDeath/Resurrect·자동 컴포넌트)
- DeathZone.cs (Coroutine·viewport 외 대기)
- Health.cs (invulnerableDuration 0.5·resurrectInvulnerableDuration 2.0·GrantInvulnerability·이벤트 3종)
- GameOptimizer.cs (신설·targetFrameRate·queriesHitTriggers·SetupOneWayPlatforms)
- PlayerInvulnerabilityFlash.cs (신설)
- ResurrectPromptUI.cs (신설)
- Player.prefab (Collider Size·Offset·m_FlipX 1)
- Enemy.prefab (m_IsTrigger 0)
- Hero1 sprite meta (combatidle 4종 rename)
- _archive/ 폴더 + 9 sprite 이동
- bak_2026* 28 파일 전수 삭제 (D 옵션)
원인 자인:
- 본 PM이 Unity 외부 영역 변경했지만 EerieVillage git commit X 영역 누적 = PD Editor에 도달 X = 옛 코드 동작
- C5·C44 위배
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>