Commit Graph

149 Commits

Author SHA1 Message Date
깃 관리자 35923be06d fix(BT12-Dev): KinematicObject base magic method override·body 초기화 (Enemy 영구 정지 근본)
PD: "여전히 움직이지 않아·실측해보고 근본 원인 체크"

근본 (MCP Play 실측·자성 #12·#13):
- KinematicObject.OnEnable·Start·Update·FixedUpdate 모두 `protected virtual`
- AnimationController는 KinematicObject 상속하지만 override X
- Unity는 Component 정의된 magic method만 호출·base class virtual은 derived가 override 안 하면 호출 안 됨
- 결과: KinematicObject.OnEnable 호출 X → body=NULL·KinematicObject.FixedUpdate 호출 X → velocity 갱신 X·gravity 적용 X
- Enemy 자연 낙하 X·patrol 동작 X·영구 정지

검증:
- MCP Play 후 body field reflection 읽기 → NULL
- Rigidbody2D 컴포넌트 자체는 GetComponent OK·OnEnable이 body 설정 안 함

fix (AnimationController):
1. Awake 영역에 base 초기화 위임:
   - body = GetComponent<Rigidbody2D>()·body.bodyType = Kinematic
   - contactFilter.useTriggers/SetLayerMask/useLayerMask
2. Update·FixedUpdate override 추가:
   - protected override void Update() { base.Update(); }
   - protected override void FixedUpdate() { base.FixedUpdate(); }
   - Unity가 AnimationController 인스턴스의 Update/FixedUpdate 호출 → base 실행

검증 후 (MCP Play):
- body=OK·IsGrounded=True·자연 낙하 정합 (pos.y=-2.5 등)
- Enemy 일부 발판 위 정착·일부 InfiniteHorizontalGround 영역 밖 무한 낙하 (별건)

회귀 영역 X:
- spriteRenderer/animator GetComponentInChildren·field initializer 가드 영역 영역 X
- KinematicObject 자체 영역 영역 X (다른 KinematicObject 상속 클래스는 별도 검증)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:57:01 +09:00
깃 관리자 899bbf16f9 fix(BT12-Dev): AnimationController field initializer NRE 정정 (Awake 실행·sr/anim/body 초기화)
PD: "여전히 움직이지 않아·실측·근본 원인 체크"

근본 (MCP Play 실측·자성 #12·#13):
- AnimationController field initializer: PlatformerModel model = Simulation.GetModel<PlatformerModel>()
- Editor·Play mode 전환 시 Simulation.GetModel 호출이 인스턴스 컨텍스트 외부에서 실행
- field initializer 영역 NRE/Exception → Component 생성 자체 실패
- Awake/OnEnable 모두 호출 X
- 결과: spriteRenderer/animator/body 모두 NULL
- AnimationController.ComputeVelocity NRE → KinematicObject.Update/FixedUpdate 영역 실행되나
  spriteRenderer.flipX/animator.SetFloat 호출 NRE → ComputeVelocity 영역 중단·targetVelocity 미설정
- velocity=0·move=0·Enemy 영구 정지

fix:
1. field initializer 폐기·Awake 영역 try-catch로 안전 초기화
   - try { model = Simulation.GetModel<PlatformerModel>(); } catch { model = null; }
2. ComputeVelocity에서 spriteRenderer/animator NULL 가드
3. model NULL 시 jumpModifier=1·jumpDeceleration=0.5 default

검증 (MCP Play):
- 직전: sr=NULL·anim=NULL·body=NULL
- 정정 후: sr=OK·anim=OK·body=OK·IsGrounded=True

회귀 영역 X:
- spriteRenderer/animator GetComponentInChildren fallback 정합
- KinematicObject·EnemyController·patrol·cliffCheck 영역 영역 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:30:01 +09:00
깃 관리자 a502c7aca6 fix(BT12-Dev): 양측 cliff wait 영역 재설정 영역 폐기 (영구 정지 정정)
PD: "몬스터들이 움직이지 않아"

근본 (MCP Play 실측):
- 4c5e33a에서 양측 cliff 분기에 _waitTimer = Random(1, 3) 추가
- 매 frame 양측 cliff 검사 → wait 재설정 → wait 가드 (line 283) return
- waitTimer가 0 도달하지 못함·patrol/cliffCheck 모두 차단·영구 정지

fix:
- 양측 cliff 영역 _waitTimer 재설정 폐기
- move.x=0·stuckTimer=0·return만 유지
- waitTimer는 patrol arrive 영역만 설정 (정상 사이클 유지)

회귀 영역 X:
- cliffCheck Trigger 제외·Enemy 영역 상대·IsGrounded 가드 영역 영역 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:19:44 +09:00
깃 관리자 486a149cd0 fix(BT12-Dev): cliffCheck Trigger 제외 (CinemachineConfiner Trigger false positive)
PD: "발판 가장자리에 버티고 대기"

근본 (MCP Play 실측·자성 #13):
- cliffCheck Physics2D.Raycast가 Trigger collider도 hit (queriesHitTriggers=true 기본값)
- CinemachineConfiner: Layer 0·PolygonCollider2D·**isTrigger=True**·맵 전체 영역
- Raycast가 Confiner Trigger를 ground로 오인 → 발판 끝에서도 cliff 미감지
- Enemy가 발판 밖으로 진행 → 도달 후 wait·정지

fix:
- Physics2D.Raycast → ContactFilter2D 버전 사용
  - cf.useTriggers = false (Trigger 제외·Confiner 무시)
  - cf.useLayerMask = true·layerMask = groundLayerMask
- 실제 발판/바닥 Solid Collider만 hit → cliff 정확 감지 → TriggerReverse·정상 patrol

회귀 영역 X:
- Wall LayerMask·Composite·발판 PlatformEffector 영역 영역 X
- 직전 Projectile useTriggers=false 패턴 정합 (BT12-Dev 2026-05-10)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:08:05 +09:00
깃 관리자 f13132ca9c fix(BT12-Dev): MeasureSafeWalkDistance 폐기·patrolMaxRange 사용
PD: "발판 가장자리까지 이동 후 멈춰있음"

근본:
- MeasureSafeWalkDistance가 Level Tilemap·AutoForeground Tilemap 의존
- Level 비활성·AutoForeground 부재 → groundTilemaps.Count=0 → return 0
- _maxRightRange=0·_maxLeftRange=0
- SetNextPatrolTarget: _targetX = _startX + Min(range, 0) = _startX
- Enemy spawn 위치 = patrol target → 즉시 arrive → wait → phase 반복 → 영구 정지

fix:
- Start 영역에서 MeasureSafeWalkDistance 호출 폐기
- _maxRightRange = _maxLeftRange = patrolMaxRange (10)
- SetNextPatrolTarget: _targetX = _startX ± Min(range, 10) → 정상 patrol
- 실제 절벽 회피는 매 frame cliffCheck Raycast (직전 a4bf508 Enemy 영역 상대)

회귀 영역 X:
- IsGrounded 가드·cliffCheck 양측 검사·KinematicObject·2D AABB Player 피격 영역 영역 X
- MeasureSafeWalkDistance 메서드는 코드 잔존 (다른 호출 없음·후속 정리)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:03:49 +09:00
깃 관리자 a4bf5086de fix(BT12-Dev): cliffCheck footAhead Enemy 영역 상대 (가장자리 걸쳐 대기 정정)
PD: "발판 가장자리 걸쳐 방향 전환 X·영구 대기"

근본:
- cliffCheckDistance=1.0 절대값 사용
- Type1 발판 폭 1.54·반=0.77 < cliffCheckDistance 1.0
- Enemy bounds.center가 발판 안에 있어도 ±1.0 unit footAhead는 양측 발판 밖
- → 양측 cliff 검출 → 영구 대기

fix:
- footAhead = bounds.center + moveDir * (bounds.extents.x + 0.15)
- Enemy 영역 가장자리 + 0.15 unit 마진 (Enemy 실제 발이 닿는 위치)
- Enemy 발판 안 → 전방만 cliff → TriggerReverse·정상 방향 전환
- Enemy 발판 가장자리 (extents 밖) → 양측 cliff → 제자리 대기 (좁은 발판)

회귀 영역 X:
- IsGrounded 가드·매 frame cliffCheck·2D AABB Player 피격 영역 영역 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:01:00 +09:00
깃 관리자 4c5e33ab46 fix(BT12-Dev): cliffCheck 양측 검사·발판 폭 좁을 시 제자리 대기
PD: "발판과 같이 떨어질 수 있는 위치 가장자리에서 방향 바꿔서 정상 patrol·순찰 범위 너무 짧으면 제자리 대기"

근본:
- 전방 cliffCheck만 검사 → 발판 폭이 Enemy 영역 2배 미만일 때
- TriggerReverse → 반대편도 cliff → 다시 TriggerReverse → 좌우 영구 반복

fix:
- 전방 cliff 감지 시 반대편(-moveDir)도 추가 검사
- 전방만 cliff → TriggerReverse (방향 전환·정상 patrol)
- 양측 cliff → 발판 폭 좁음 → 제자리 대기 (move.x=0·waitTimer 재설정)

회귀 영역 X:
- IsGrounded 가드·매 frame cliffCheck·KinematicObject·2D AABB 영역 영역 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 16:58:29 +09:00
깃 관리자 da6e694d5c fix(BT12-Dev): Player 피격 — Bounds.Intersects → 2D AABB (Z 무시)
PD: "지시 수정 정합 X·변화 X"

근본 (MCP Play 직접 실측·자성 #13):
- Enemy 강제 Player 위치 이동 후에도 Intersects=False
- Bounds 분석:
  - Enemy z=0 (Variant prefab default)
  - Player z=1 (Scene 영역)
  - Bounds.Intersects는 3D 비교 → Z 1 unit 차이로 항상 false

fix:
- Bounds.Intersects 폐기·2D AABB 직접 검사
- Mathf.Abs(deltaX) < (eExtents.x + pExtents.x) && deltaY 동일
- Z 좌표 무시·2D 게임 정합

회귀 영역 X:
- IsGrounded 조건·cliffCheck·KinematicObject·VisualBounds 영역 영역 X
- 영역 1 (cliffCheck 매 frame) 정합 유지

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 16:55:06 +09:00
깃 관리자 e3e4f97a6f fix(BT12-Dev): cliffCheck 매 frame·VisualBounds → SpriteRenderer 정정
PD 영역 1: 발판 위 Enemy 가장자리에서 방향 전환 X·한방만 바라보다 떨어짐
PD 영역 2: Player 피격 X

근본:
1. cliffCheck phaseCooldown 가드
   - TriggerReverse 시 phaseCooldown=1.0s 설정·이 동안 cliffCheck 비활성
   - 발판 끝 회피 후 1초간 cliff 미감지 → KinematicObject 진행 → 발판 밖 → 낙하
2. VisualBounds = Collider.bounds (직전 daad311)
   - CapsuleCollider 작음 (0.33×0.33)·Player BoxCollider (0.77×1.02)
   - Intersects 영역 너무 좁아 hit X

fix:
1. cliffCheck phaseCooldown 가드 폐기·매 frame 검사
   - stuckTimer만 phaseCooldown 가드 유지 (좌우 반복 방지)
2. VisualBounds = Visual.SpriteRenderer.bounds 우선
   - sprite 실제 시각 영역·Player 접촉 판정 정합

회귀 영역 X:
- IsGrounded 가드·TriggerReverse·KinematicObject 영역 영역 X
- Player IsGrounded 조건 유지 (밟기 X·점프 통과 정합)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 16:51:44 +09:00
깃 관리자 fc351795e7 fix(BT12-Dev): UpdatePatrol IsGrounded=True 영역만 동작 (공중 낙하 시 skip)
PD: "(나)안 — 어느 위치에 있든 절벽 회피·단 순찰 패턴 아닐 때 (공중 낙하 등) 상관 없음"

근본 정리:
- cliffCheck Raycast는 기존부터 정합 (Layer 0 발판·바닥 모두 hit)
- 공중 낙하 시 cliffCheck 적용되면 즉시 TriggerReverse → 자연 낙하 방해

fix:
- UpdatePatrol 시작 영역에 IsGrounded 가드
- control.IsGrounded=False (공중·피격 밀림·spawn 직후 낙하 등) → patrol·cliffCheck skip
  move.x=0·stuckTimer=0·return
- KinematicObject 자연 낙하·바닥/발판 정착 → IsGrounded=True → patrol 재개·cliffCheck 정합

회귀 영역 X:
- 영역 1 (애니메이션 Clip path)·영역 2 (Collider bounds) 정합 유지
- TriggerReverse·MeasureSafeWalkDistance·KinematicObject 영역 영역 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 16:48:08 +09:00
깃 관리자 daad31171b fix(BT12-Dev): Clip path Visual → '' + VisualBounds → Collider bounds
PD 영역 1: 이동 애니메이션 재생 X
PD 영역 2: Player·Enemy 충돌 시 피해 X

근본:
1. 애니메이션 — Animator가 Visual 자식에 부착됨 + Clip path "Visual"
   - Animator path는 Animator 기준 자식 경로 → "Visual/Visual" 자식 찾음·존재 X
   - SpriteRenderer sprite curve 미적용 → 이동 시 Run sprite 교체 X

2. 피해 — VisualBounds = Visual.SpriteRenderer.bounds
   - Visual 자식 분리 후 sprite bounds는 시각만·실제 Collider 영역과 별
   - Player BoxCollider와 Visual.bounds.Intersects 정합 X

fix:
1. 35 Clip path "Visual" → "" (Animator·SpriteRenderer 동일 GameObject = Visual)
2. EnemyController.VisualBounds = _collider.bounds 우선 (CapsuleCollider 영역·실제 충돌)

영역 3 (발판 위 spawn) — PD 결정 대기 (가/나 분기).

회귀 영역 X:
- Variant Visual 자식 sprite override·AnimationController·KinematicObject 영역 영역 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 16:46:27 +09:00
깃 관리자 5355222dc7 fix(BT12-Dev): BT102 떨어짐 검출 텔레포트 폐기 (절벽 텔레포트·공중 spawn 회귀 정정)
PD 영역 1+3:
- "절벽에 닿으면 텔레포트" 회귀 — 이전 정상 방향 전환 동작
- "공중 spawn Enemy가 떨어지지 않고 이전 위치로 되돌아감"

근본 (단일):
- EnemyController.Update의 BT102 (line 360-376) 떨어짐 검출 텔레포트
- _isInitialized && y < _startY - fallThreshold(1.0) → 시작 위치 텔레포트
- 절벽 케이스: TriggerReverse 방향 전환 직후 fallThreshold 진입 → 텔레포트가 방향 전환을 덮어씀
- 공중 spawn 케이스: 떨어지는 즉시 fallThreshold 진입 → spawn 위치 복귀 무한 반복

fix:
- BT102 떨어짐 검출 텔레포트 영역 폐기
- 자연 낙하 + TriggerReverse 절벽 방향 전환만 동작
- 공중 spawn Enemy도 자연 낙하·KinematicObject Cast로 GameObject 위 정착

영역 2 (렉) 별건 — PD 측정 영역 필요·후속 안건.

회귀 영역 X:
- TriggerReverse cliffCheck Raycast 절벽 방향 전환 정합
- KinematicObject 자연 낙하·IsGrounded 정합
- Player·Enemy 충돌·발판 통과·Variant 영역 영역 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 16:40:10 +09:00
깃 관리자 e38c1a5c12 fix(BT12-Dev): AnimationController RequireComponent 제거·Enemy.prefab root SR/Animator 폐기·Variant 6 재생성
PD: "몬스터 방향 전환 시 이미지 잘못 출력"

근본:
- AnimationController에 [RequireComponent(SpriteRenderer, Animator)] 잔존
- Enemy.prefab root SR·Animator 제거 시도가 RequireComponent에 의해 차단
- Variant 6 모두 root SpriteRenderer 잔존·AnimationController.spriteRenderer = root
- ComputeVelocity의 flipX = root에 적용·실제 보이는 Visual 자식 SpriteRenderer 영향 X
- 방향 전환 시 sprite flip 안 됨

fix:
1. AnimationController.cs — [RequireComponent] 제거
2. Enemy.prefab base — root SpriteRenderer·Animator 폐기
3. Variant 6 prefab 재생성 (이전 Variant 폐기·신규)
   - Visual 자식 SpriteRenderer.sprite·Animator.runtimeAnimatorController override
4. Scene 16 Enemy instance root SR·Animator 잔존 폐기
5. 결과: AnimationController.spriteRenderer = GetComponentInChildren<SpriteRenderer>() = Visual.SpriteRenderer
   flipX·sprite·Animator 모두 Visual 자식 단일화

회귀 영역 X:
- Visual 자식 SpriteRenderer·Animator·OverrideController 정합
- KinematicObject·Collider·EnemyController patrol 영역 영역 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 16:15:43 +09:00
깃 관리자 551bc048a4 feat(BT12-Dev): Visual 자식 분리·Clip path Visual·Variant Visual sprite override
PD: "가 — Visual 자식 분리 (이미지만 위로 띄우기 가능)"

근본:
- Enemy GameObject root에 SpriteRenderer·Animator·Collider 모두 묶임
- prefab y 변경 시 Collider까지 같이 이동 → 시각만 분리 불가

fix:
1. Enemy.prefab — Visual 자식 GameObject 신규
   - root SpriteRenderer·Animator 제거
   - Visual 자식에 SpriteRenderer·Animator 부착·기존 setting 이전
2. 35 AnimationClip path 변경
   - EnemyIdle/Run/Hurt/Death/Attack + 30 M00x Clip
   - path="" → path="Visual" (자식 SpriteRenderer 바인딩)
3. Variant 6개 SpriteRenderer override 재적용
   - Visual.SpriteRenderer.sprite = M00x_idle01_0 종별
   - Visual.Animator.runtimeAnimatorController = M00x.overrideController 종별
4. AnimationController·EnemyController
   - spriteRenderer = GetComponent<SpriteRenderer>() ?? GetComponentInChildren<SpriteRenderer>()
   - animator 동일 패턴
5. Scene 16 Enemy position override 복원 (직전 b41cdf6 revert)

PD Variant prefab 영역 Visual 자식 localPosition.y Inspector 조절 시 시각만 위로 이동·Collider 영역 X.

회귀 영역 X:
- KinematicObject·Collider·Rigidbody·EnemyController patrol·발판 통과 정합

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 15:53:37 +09:00
깃 관리자 ddc0e250e5 fix(BT12-Dev): Player ↔ Enemy 닿음 시 피해 복원 (지상만·점프 통과)
PD: "Enemy 닿으면 Player 피해 (밟기는 X·통과)"

근본:
- 직전 commit adcb1ac에서 Player↔Enemy 충돌 검출 자체 폐기
- Player 피해 경로 부재 → 복원 필요·단 밟기는 X

fix (EnemyController.Update):
- _cachedPlayer 캐싱 (Tag·fallback)
- Player.IsGrounded && VisualBounds.Intersects(Player.Bounds)
  → !IsInvulnerable 시 Player.health.Decrement (i-frame 적용)
- 공중 (점프) 상태는 통과·밟기 판정 X·EnemyDeath·Bounce X

회귀 영역 X:
- Enemy 사망 경로: Player 공격(Projectile·AttackHitbox)만 정합
- Player ↔ Enemy IgnoreCollision Awake 적용 정합·물리 통과
- Enemy ↔ Enemy IgnoreLayerCollision·발판 통과·scale·patrol 정합

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 11:24:42 +09:00
깃 관리자 adcb1ac1b1 fix(BT12-Dev): 밟기 공격 기능 제거 — PlayerEnemyCollision 폐기·Player↔Enemy 충돌 검출 제거
PD: "밟아서 적을 공격 가능한 기능 제거 (관련 기능 모두 삭제)"
PD: "몬스터는 Player 공격에만 피해를 받음"

변경:
1. PlayerEnemyCollision.cs·meta 삭제
   - 점프+위 = EnemyDeath·Bounce 로직 폐기
   - 지상 측면·아래 = i-frame 피격 로직 폐기
2. EnemyController.cs
   - hitRangeX·hitRangeY·stompMinDy 필드 폐기
   - Update 영역 Player ↔ Enemy Bounds.Intersects 검출 폐기
   - PlayerEnemyCollision Schedule 폐기
   - _cachedPlayer·_diagWasIntersecting·VisualBounds 사용처 폐기
   - Player ↔ Enemy IgnoreCollision Awake 시점 적용 유지 (물리 통과 정합)

회귀 영역 X:
- Enemy 사망 경로: Player Projectile·AttackHitbox → Health.Decrement → Schedule<EnemyDeath> 정합 유지
- Player 피해 경로: 밟기 충돌 폐기·Enemy 공격 로직 후속 PD 지시 대기
- Enemy patrol·발판 통과·Enemy ↔ Enemy 통과·scale 1.19 정합

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 11:15:20 +09:00
깃 관리자 03a6521631 auto: 2026-05-12 11:03 · scene: Lobby · 42 files 2026-05-12 11:03:10 +09:00
깃 관리자 81898adab6 fix(BT12-Dev): Enemy ↔ Enemy IgnoreLayerCollision + scale 1.7 → 1.19 (30% 영역)
PD: "몬스터끼리 충돌하지 않고 통과"
PD: "몬스터 크기 30% 영역"

fix:
1. Enemy ↔ Enemy IgnoreLayerCollision
   - Physics2D.IgnoreLayerCollision(14, 14, true)
   - EnemyController.Awake 영역 (idempotent·매번 호출 무관)
2. Enemy.prefab transform.localScale 1.7 → 1.19 (30% 영역)
   - Scene 영역 16 instance prefab override 자동 영역
   - sprite·BoxCollider·CapsuleCollider 비례 영역

회귀 영역 X:
- Enemy ↔ Player IgnoreCollision (Layer 14 ↔ Layer 13 별도) 정합
- Enemy ↔ 발판 IgnoreCollision (PlatformEffector2D 별도) 정합
- KinematicObject minMoveDistance·shellRadius 절대값 정합

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 01:39:54 +09:00
깃 관리자 38031279d1 fix(BT12-Dev): 몬스터 종류 random — 6 OverrideController·MonsterRandomizer
PD: "몬스터 색을 랜덤으로 하라는 얘기가 아니라 몬스터 종류를 랜덤으로 하라고 했잖아"

자성: 직전 commit 6e774dc에서 PD 의도 오역 — 색 tint 영역. 종류(sprite) random 의도 정합 X.

근본 (MCP 자율 영역):
- Enemy.prefab idleFrames 24 sprite (M001~M006 × 4 idle frame) 영역 영역
- Enemy.controller 4 Clip (EnemyIdle·EnemyRun·EnemyHurt·EnemyDeath)
- 영역: 6 Idle Clip + 6 OverrideController·EnemyIdle만 override

fix:
1. 6 AnimationClip 신규 — M001_Idle ~ M006_Idle.anim
   - 각 4 sprite keyframe·frameRate 12·loopTime=true
   - SetObjectReferenceCurve (m_Sprite property)
2. 6 AnimatorOverrideController 신규 — M001 ~ M006.overrideController
   - runtimeAnimatorController = Enemy.controller
   - EnemyIdle Clip → M00x_Idle Clip override
   - EnemyRun·EnemyHurt·EnemyDeath 영역 (영역 sprite·6종 영역 영역 영역)
3. MonsterRandomizer 영역
   - overrideControllers[6] 영역
   - Awake 영역 random select·animator.runtimeAnimatorController = overrideControllers[idx]
   - 색 tint 영역 폐기
4. Enemy.prefab MonsterRandomizer.overrideControllers 6 OverrideController 영역
5. Scene 영역 활성 Enemy 16개 SpriteRenderer.color = white (이전 tint 영역)

회귀 영역 X:
- Animator (Idle·Run·Hurt·Death) 정합 유지·EnemyIdle만 override
- One-Way Platform·Enemy 발판 IgnoreCollision·Player·Camera 영역 영역 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 01:37:54 +09:00
깃 관리자 6e774dc375 fix(BT12-Dev): Enemy 발판 IgnoreCollision + MonsterRandomizer 6 색상 tint
PD: "몬스터도 발판 자유 통과"
PD: "몬스터 랜덤 변경"

근본 (MCP 자율 실측):

1. Enemy 발판 통과
   - Layer 14 (Enemy) ↔ Layer 0 (발판) collide=True → Enemy 발판 영역
   - PlatformEffector2D surfaceArc 170°·옆 영역 통과·발판 위 영역 영역
   - fix: EnemyController.Awake 영역 PlatformEffector2D 영역 IgnoreCollision 일괄 등록
     → Enemy 16개 × 발판 17개 모두 IgnoreCollision·발판 영역 영역 X·자유 통과

2. 몬스터 랜덤
   - 직전 MonsterRandomizer 폐기 (Animator 영역)
   - 영역 영역 — 6 Override Controller·24 Clip 신규 영역 영역 영역 영역 영역
   - 영역 — SpriteRenderer.color 6 random tint
     White·Red·Green·Blue·Yellow·Purple·Awake 1회 random
   - Animator (Idle·Run·Hurt·Death) 정합 유지·sprite swap X·tint만 영역
   - 영역 영역 영역·영역 영역 영역 영역

회귀 영역 X:
- One-Way Platform·Player 영역 영역 X·Camera·Wall LayerMask·Composite 정합

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 01:18:09 +09:00
깃 관리자 c18562bf11 fix(BT12-Dev): MonsterRandomizer Animator 활성 + Enemy patrol 5~10 unit
PD: "이동·죽음·히트 애니메이션 재생 X → 잘 나오도록 수정"
PD: "맵 전체 patrol → 자신 주위 적절 범위 patrol"

근본 (MCP 자율 실측):

1. 애니메이션 — MonsterRandomizer.Awake line 28 `anim.enabled = false`
   - Animator 비활성 → AnimationController.SetFloat("velocityX", ...) 영향 X
   - Idle/Run/Hurt/Death state 영역 영역 X·sprite 수동 idle만
   - fix: anim.enabled=false 제거·sprite 수동 영역 폐기·Animator Clip 정합
   - Enemy.controller transition·parameter 정합 (직전 entry 7 fix 영역)

2. patrol 범위 — Enemy.prefab patrolMin=50·Max=75 (맵 전체)
   - Camera ortho 5.0·camWidth 17.78·주위 영역 영역 5~10 unit 정합
   - fix: patrolMin=5·Max=10 (Enemy.prefab 영역·Scene 16 instance 자동 반영)

회귀 영역 (Minor 사전 고지):
- 6종 random idle 영역 영역 영역 X — 모든 Enemy 동일 외형
- 6종 random visual 다양성 영역 후속 안건 (Sprite 동적 randomization·6 controller·SubStateMachine)·본 fix 영역 외

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 00:00:45 +09:00
깃 관리자 6b1730bd45 fix(BT12-Dev): Camera ortho 5.0 + Enemy PrefabUtility + patrol fallback + RangeTier
PD: "전혀 변화가 없어"·"적이 움직이지 않음"·"멀리서 보는 형태로 바꿔야"

근본 4종 (MCP 자율 실측·자성):

1. Camera 영역 (PD "멀리서") — Cinemachine Lens.OrthographicSize 3.5 → 5.0
   visible width 12.44 → 17.78·height 7 → 10
   TargetOffset.y 1.0 → 0 (ortho 증가 정합 PM 추정·PD 명시 X)

2. Enemy 위치 -3.62 적용 X (직전 230d755 적용 실패)
   - 원인: SetDirty만 호출·PrefabUtility.RecordPrefabInstancePropertyModifications 누락
   - prefab instance override 저장 X → Awake startY=-1.62 잔존
   - fix: PrefabUtility.RecordPrefabInstancePropertyModifications(transform)

3. Enemy patrol fallback (직전 9bc9ccb fix 미작동)
   - 원인: AutoForeground Tilemap 활성·groundTilemaps.Count=1
   - Count==0 fallback 영역 X·MeasureSafeWalkDistance line 199 startTm==null → return 0
   - fix: line 199 fallback 추가 — `if (startTm == null) return patrolMaxRange`

4. RangeTier mults 정정 (Camera ortho 영향)
   - camWidth 12.44 → 17.78 (1.43배)
   - mults 1/1.43 비례 축소: 0.2/0.5/0.667/1.0/1.5 → 0.14/0.35/0.467/0.7/1.05
   - maxRange 동등 유지 (A02 MediumLong 12.44 unit 정합)

회귀 영역 X:
- Camera height 10·Background height 10.25 정합
- Confiner Camera Y allowed -11.29~5.71 정합
- Enemy stuckThresholdTime·_phaseCooldown 영역 영역 X
- cliffCheck Layer 0 GameObject hit 정합

본 PM 자성:
- 직전 commit 230d755·9bc9ccb 적용 X 미실측 (자성 #15 패턴 재발)
- PrefabUtility 의무 미준수·fallback 조건 분기 미실측
- "PD 변화 X" 보고 시 즉시 MCP 실측 의무

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 23:47:29 +09:00
깃 관리자 9bc9ccb48e fix(BT12-Dev): Camera TargetOffset.y 1.62→1.0 + Enemy patrol Tilemap 부재 fallback
PD: "화면 하단이 좀 더 보여야할거 같아"
PD: "왜 적이 움직이지 않는거지? 적이 움직이게 해줘"

근본 (MCP 자율 실측):

1. Camera 하단
   - 직전 230d755 TargetOffset.y=1.62·visible -1.38 ~ 5.62 (Background top 정렬·하단 미노출)
   - 정정 TargetOffset.y=1.0·Camera Y=1.5·visible -2.0 ~ 5.0 (하단 1.0 unit 추가)

2. Enemy patrol 정지
   - EnemyController.MeasureSafeWalkDistance (line 146-223)
     groundTilemaps: Level 비활성 (48109f9)·AutoForeground 부재 → Count=0 → return 0
     → _maxRange=0 → SetNextPatrolTarget targetX = startX → 정지
   - fix: Tilemap 부재 fallback
     ```
     if (groundTilemaps.Count == 0) return patrolMaxRange;
     ```
     → _maxRange=75·Phase 0/2 startX ± min(50~75, 75) → 좌우 왕복

회귀 영역:
- cliffCheck Raycast Layer 0 (groundLayerMask (1<<0)|(1<<16))·GameObject Layer 0 hit 정합
- InfiniteHorizontalGround Camera 따라 reposition·Composite (53.12 unit) 영역 외 patrol 도달 시 항상 collide
- Cinemachine Confiner BoundingShape2D·Composer offset 영향 X
- Enemy IgnoreCollision Player·Layer 14↔13 정합

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 23:34:00 +09:00
깃 관리자 832cc07661 feat(BT12-Dev): InfiniteHorizontalGround 컴포넌트 신규 (PD 결정 (나)·Background 패턴)
PD: "Background 밑에 GameObject 배치·맵 최하단·맵에 맞게 사이즈 자동" → "(나) 형태로 진행해"

신규 컴포넌트 — Assets/Scripts/Background/InfiniteHorizontalGround.cs:
- InfiniteHorizontalBackground 동일 패턴·BoxCollider 영역 적용
- Start: BoxCollider size.x 측정 + 자식 사본 2개 (Left·Right) 자동 생성
  자식 BoxCollider는 부모 Static Rb attachedRigidbody 자동 상속
- LateUpdate: Camera.x 영역 BoxCollider 폭 정수 배수 root reposition

Scene 변경 — GameObject (Layer 0·Static Rb·직전 48109f9):
- pos (0.5,0,10) → (0, -4.62, 0)
  Background sprite 최하단 = pos.y(0.5) - height(10.25)/2 = -4.62
- BoxCollider size (1,1) → (53.12, 1.00)
  Background sprite width = 26.56 unit × lossyScale 2 (1.7×배경 추가 영역) = 53.12
- InfiniteHorizontalGround 부착

회귀 영역 X:
- KinematicObject Cast — 자식 BoxCollider + 부모 Static Rb 표준 정합
- Wall LayerMask (1<<0) Layer 0 정합
- Composite Level 비활성·Player·Enemy 1.7배·Background reposition Camera.x 동기

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 22:35:46 +09:00
깃 관리자 2b8828bf37 fix(BT12-Dev): Wall OverlapPoint LayerMask Layer 16 → Layer 0 (회귀 정정)
PD: "왜 투사체가 또다시 벽을 뚫고 지나가는거지?" 회귀.

근본 — MCP 자율 실측 (자성 #13 정합):
- Wall = Level TilemapCollider2D (Layer 0·Default·isTrigger=False·Static)
- 직전 WallLayerMask = (1 << 16) → Layer 16 (Foreground) Tilemap 영역 영역 X
- Layer 0 영역 OverlapPoint hit X → SelfDestruct X → 벽 뚫고 지나감

fix — WallLayerMask = (1 << 0):
- Layer 0 Solid: Level Tilemap·GameObject·Alien BoxCollider2D = Wall 정합
- Trigger collider (CinemachineConfiner Polygon·Token·DeathZone Box)
  = useTriggers=false 자동 제외
- Player Layer=13·Enemy Layer=14 → OverlapPoint hit 무관·정합

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 21:22:10 +09:00
깃 관리자 1ef19890a5 feat(BT12-Dev): MonsterRandomizer 수동 idle animation (6×4 frames) + Projectile speed 12→6 (거리 차이 체감) 2026-05-10 17:50:28 +09:00
깃 관리자 dd6ab3f8f1 feat(BT12-Dev): MonsterRandomizer 6종 sprite + WallMask Layer 16 (Layer 0 Level Tilemap 영역 영역 거리 X 정정) 2026-05-10 17:40:06 +09:00
깃 관리자 72e033da5a fix(BT12-Dev): OverlapPoint useTriggers=false (CinemachineConfiner Trigger 영역 영역 → 즉시 SelfDestruct 영역) 2026-05-10 17:22:59 +09:00
깃 관리자 e7e120feef feat(BT12-Dev): RangeTier 5단계 + aspect fallback (PD 사정거리 영역) 2026-05-10 16:56:20 +09:00
깃 관리자 6a160d5f5f fix(BT12-Dev): Wall OverlapPoint grace 0.05s + spawn OffsetDistance (회귀 정정) 2026-05-10 16:50:08 +09:00
깃 관리자 3f69cc04fe fix(BT12-Dev): PD #2 재발 정정 — Projectile.Update Physics2D.OverlapPoint Wall 탐지 (OnTriggerEnter2D 영역 Static collider 영역 발화 X)
근본 원인 (MCP 직접 진단):
- Wall = TilemapCollider2D (Layer 0 Level·Layer 16 AutoForeground)·isTrigger=false·Rigidbody2D 부재 (Static)
- Projectile = CircleCollider2D·isTrigger=true·Rigidbody2D 부재 (Static)
- Static (Trigger) ↔ Static (Solid) → OnTriggerEnter2D 발화 X (Unity 2D Physics 표준)
  → 직전 fix `Layer 0/16 isWall` 분기 영역 호출 X

해결:
- Projectile.Update 영역 매 frame Physics2D.OverlapPoint(transform.position, WallLayerMask) 영역 검출
- WallLayerMask = (1 << 0) | (1 << 16) — Layer 0 Default·Ground + Layer 16 Foreground·발판
- hit != null → SelfDestruct (영역 영역 영역 영역 영역 영역 정합)
- OnTriggerEnter2D 영역 isWall 분기 영역 영역 영역 (영역 영역 영역 영역 영역)

진단 Debug.Log 회수 (이전 추가분).

PD 보고 (2026-05-10): "벽에 닿은 투사체가 여전히 소멸하지 않아"

PD #1 (적이 죽지 않음) — 본 PM MCP 직접 검증 결과:
- Enemy maxHP 20·damage 5·4hit kill 영역 영역
- Schedule<EnemyDeath> 영역 호출 영역 영역 — Execute 영역 호출 영역 정합 (직접 검증)
- → Editor 영역 영역 영역 영역 영역 영역 영역 X (runInBackground·Game window) — PD 영역 직접 Play 영역 검증 영역 영역
2026-05-10 16:46:04 +09:00
깃 관리자 5cb6040c8a feat(BT12-Dev): PD 4 지시 — Projectile 거리 제한·벽 충돌·특성 가시화·Icon UI 매핑 (MCP 자율)
PD 지시 (2026-05-10):
1. 투사체 종류 영역 일정 거리 영역 소멸 (Camera width × 1.5)
2. 레이저 외 투사체 영역 벽 충돌 시 소멸
3. 스킬 특성 영역 컨셉 동작
4. 스킬 선택 UI 영역 아이콘 노출

본 PM MCP 자율 진행:

==== PD #1: 거리 제한 ====
Projectile.Initialize:
- _spawnPosition 저장
- _maxRange = Camera.orthographicSize × 2 × aspect × 1.5 (가로 × 1.5)
Projectile.Update:
- Distance(transform.position, _spawnPosition) >= _maxRange → SelfDestruct

==== PD #2: 벽 충돌 ====
Projectile.OnTriggerEnter2D:
- isEnemy 처리 → hit 후 SelfDestruct·return
- Layer 0 (Default·Ground) || Layer 16 (Foreground·발판) → SelfDestruct
- 본 Projectile 영역 = A 카테고리 (레이저 영역 영역 X) — 모든 영역 SelfDestruct 정합

==== PD #3: 특성 가시화 ====
StatusApplier·EnemyStateComponents 영역 — DoT·Stun·Slow·Knockback·DebuffStack 영역 영역 정합 영역.
근본 영역 — Enemy hp 4·damage 5·1hit 즉사 → 효과 시각 X.
정정 — Enemy.prefab maxHearts 1→5 (maxHP 4→20) — A02 DoT·A03 Stun·A14 Slow 영역 4 hit 영역 영역 영역.

==== PD #4: Icon UI ====
SkillCardSlot _icon 매핑 X 영역 — BannerFrame04_Divided 자식 영역 SkillIcon GameObject 신규 추가 + Image 컴포넌트
- anchorMin·max (0.5, 0.7)·sizeDelta (120, 120)·preserveAspect true
- 3 슬롯 영역 _icon 필드 매핑 정합

Scene SkillSelectionCanvas·Enemy 인스턴스 RevertPrefabInstance — prefab 변경 동기화

MCP Play 검증:
- enemyMaxHP 20 ·컴파일 에러 0 ·Icon 매핑 3/3 
2026-05-10 16:23:34 +09:00
깃 관리자 a6e168e86b fix(BT12-Dev): 무한 배경 컴포넌트 InfiniteHorizontalBackground — sprite 재활용 reposition 패턴 (PD 지적 정정)
PD 지적 (2026-05-10):
- "단순히 키운거라서 비효율적 — 리소스를 재활용할 수 있는 기능 구현"

본 PM 자성 — 직전 Tiled DrawMode size (500, 7) 영역 단순 영역 영역 메모리·렌더 영역 비효율. 영역 영역 — Camera 영역 영역 영역 sprite 영역 reposition 패턴 (재활용·효율).

신규 컴포넌트 InfiniteHorizontalBackground.cs:
- Start — sprite 가로 폭 측정 + 자식 사본 2개 (Left·Right) 영역 영역 영역 영역
  → 화면 영역 영역 영역 3 sprite (root + Left + Right) 영역 충분 (sprite > Camera width 정합)
- LateUpdate — Camera 영역 영역 영역 영역 sprite 폭 영역 영역 영역 → root 영역 정수 배수 reposition
  → 자식 사본 영역 영역 영역 영역 따라가 영역 영역 영역 영역 영역 영역
- 효율 — sprite 1개 (Resources 1회·Texture 메모리 재사용)·GameObject 3개

Background_BgImage1 정정:
- DrawMode Tiled → Simple (sprite default size·재활용 패턴 정합)
- Scale (1.77, 1.77, 1) — Camera height fit
- Position (0, 0.5, 10) — World root
- InfiniteHorizontalBackground 컴포넌트 부착

MCP Play 검증:
- SendMessage("LateUpdate") → bgPos 0 → 188.04 reposition 정합
- Camera 150 → bgChild0 (94.02)·bgChild1 (282.07) — Camera 영역 영역 sprite 3 영역 정합
2026-05-10 16:03:55 +09:00
깃 관리자 62c8c93e6e feat(BT12-Dev): 스킬 선택 UI Layer Lab BannerFrame04_Divided 적용 (가로형 Magicka 스타일·옵션 C)
PD 결정 (2026-05-10): 옵션 A 즉시 적용 + 가로형 화면 (Magicka 스타일)
실제 적용: 옵션 C — Layer Lab 전체 nested (103 obj·Editor freeze) 회피·BannerFrame04_Divided × 3 직접 추가

본 PM MCP 자율 진행:
1. SkillSelectionCanvas 영역 자식 (SkillSelectionPanel) 제거 → Layer Lab 적용 준비
2. Layer Lab Play_UI_ChoiceSkill nested Instantiate 시도 → Editor freeze (last_heartbeat 정지·103 obj 영역)
3. Editor 강제 종료 (taskkill PID 25912) + PD 재시작 + instance 재연결
4. 옵션 C 적용 — execute_code 영역 직접 구성:
   - SkillSelectionPanel (Image·dim 0.78 alpha·anchor stretch)
   - TitleText (TextMeshPro "기술 선택"·중앙 상단·금색)
   - CardArea (HorizontalLayoutGroup·1500x600·spacing 30·MiddleCenter)
   - SkillCardSlot1·2·3 (Layer Lab BannerFrame04_Divided nested prefab)
5. 각 카드 영역 SkillCardSlot 컴포넌트 부착·Button 부착·필드 매핑:
   - _nameText → BannerFrame04_Divided/Text_Title
   - _descriptionText → BannerFrame04_Divided/Text_Info
   - _topBanner·_highlightFrame → BannerFrame04_Divided/Border
   - _clickArea → 카드 자체 Button (targetGraphic = Bg/Image)
6. SkillSelectionUI _rootPanel·_titleText·_slot1·2·3 매핑
7. Scene 영역 SkillSelectionCanvas instance RevertPrefabInstance 강제 동기화 (Awake _rootPanel=NULL → SkillSelectionPanel 정합)
8. SkillSelectionUI.cs OnCardSelected 정정 — 카드 클릭 → 즉시 _onConfirm.Invoke (Magicka 스타일·Confirm 버튼 부재)

MCP Play 검증:
- [SkillSelectionUI] Awake _rootPanel=SkillSelectionPanel 
- [ExperienceSystem] OnEnemyKilled → GainXP +1 → LEVEL UP Lv.2 
- [LevelUpManager] cards.Count=3 → SkillSelectionCanvas 활성 
- [SkillSelectionUI] Show cards=3 level=2 
2026-05-10 15:35:52 +09:00
깃 관리자 af6ac1652c chore(BT12-Dev-Death): Health.cs 진단 Debug.Log 3줄 회수 — 사망 원인 확정 후 회수 의무 정합
회수 영역:
- Decrement(damage) line 132 — Debug.Log + StackTrace 1줄
- DecrementSilent(damage) line 205 — Debug.Log 1줄
- Die() line 257 — Debug.Log + StackTrace 1줄

진단 도구 회수 누적: Projectile 8 + AttackHitbox 1 + EnemyDeath 1 + Health 3 = 13줄 전수 회수.

PD 정합 (2026-05-10): "이제 정상적으로 적이 죽는거 같아."
2026-05-10 01:31:58 +09:00
깃 관리자 6a825fc9b7 fix(BT12-Dev): 투사체 damage 5 하한 + Schedule<EnemyDeath> 추가 — 적 처치·경험치·레벨업 정합
PD 지시 (2026-05-10):
- "여전히 내 투사체에 적이 죽지 않고, 경험치를 제공하지 않아"
- "혹시 투사체 공격력이 없어서 그렇다면 기본 공격력을 5로 고정해(임시)"
- "적이 죽으면 죽는 모션과 함께 소멸되어야 해"
- "적이 죽으면 경험치를 제공해야 하고, 레벨업이 가능해야 해"

본 PM MCP 자율 진단:
- Console 영역 [Health@Enemy] Decrement(damage=4) hp 4→0 정합
- 그러나 [ExperienceSystem] X·[PlayerProgression] X·[EnemyDeath] X
- → Projectile.cs 영역 Schedule<EnemyDeath> 호출 누락 확정

근본 fix 2종:
1. damage 5 하한 강제 (임시·PD 지시) — `int damage = Mathf.Max(_runtime.CalculateEffectiveDamage(), 5);`
   → balance-designer 정식 수치 영역 임시 영역
2. Schedule<EnemyDeath> 추가 (근본·AttackHitbox.cs:70~76 패턴 정합)
   → Enemy hp 0 도달 시 EnemyDeath 체인 발동 → ExperienceSystem.OnEnemyKilled → 경험치·레벨업

검증 (MCP Play):
- damage=5 hp 4→0 (1hit kill) 
- ExperienceSystem.OnEnemyKilled → GainXP +1 
- PlayerProgression Lv.1→2→3→4 
- SkillSelectionUI Show + 카드 확정 (파이어볼·추적 화염구) 

PD 지시 3가지 전부 정합.
2026-05-10 01:25:12 +09:00
깃 관리자 f50196056b fix(BT12-Dev): EnemyDeath 근본 fix — Animator transition 5 + UnscaledTime + 진단 회수
근본 원인 (본 PM MCP 직접 진단):
- Enemy.controller 영역 Idle/Run/Hurt → Death/Hurt transition 부재 → death Trigger 호출 영역 transition X
- Animator updateMode = Normal·Time.timeScale = 0 (LevelUp 카드 선택) → Animator.Update 정지 → transition 영역 X

해결 (본 PM 자율 결정 + MCP 직접 적용):
- Enemy.controller transition 5 추가 (Idle→Death, Idle→Hurt, Run→Death, Run→Hurt, Hurt→Death)
  → manage_animation controller_add_transition 영역 직접 호출
- EnemyDeath.cs animator.updateMode = AnimatorUpdateMode.UnscaledTime 추가
  → Time.timeScale = 0 영역 영역 Animator 영역 정상 진행 → death animation 재생 + transition 발동
- 진단 Debug.Log 회수: Projectile (8 분기)·AttackHitbox (1줄)·EnemyDeath (1줄)
  → 사망 원인 확정 영역 회수 의무 정합

본 PM MCP 직접 진단 절차:
1. read_console — Console 직접 읽기 (Health@Enemy·Projectile 출력 검증)
2. controller_get_info — Enemy.controller parameters·states·transitions 직접 검증
3. execute_code — Player·Enemy 위치·Schedule<EnemyDeath> 직접 호출·Animator state 검증
4. manage_animation controller_add_transition — Animator transition 5 직접 추가
5. anim.SetTrigger("death") + anim.Update(0.5f) → Baddie-Death 진입 정합 검증

PD 결정 (2026-05-10): "MCP 활용해서 네가 직접 체크해" — 본 PM 자율 진단·fix·검증.
PD 자성 #13: PD에게 작업 떠넘기기 금지·MCP 능동 활용 의무.
2026-05-10 01:09:17 +09:00
깃 관리자 d6764ceb6e diag(BT12-Dev): AttackHitbox·EnemyDeath 진단 Debug.Log 추가 — Enemy 사망 처리 X 근본 진단
배경 (자성 누적):
- 본 PM 가설 5회 누적 부정확
- PD Console 정확 분석: 투사체 hit X·AttackHitbox(BT7-Dev 자동 근접) hit
- t=5.35 [Projectile][Enter] other=Enemy = Enemy Collider 활성 → EnemyDeath.Execute 호출 X 영역 확정

진단 Debug.Log:
- [AttackHitbox][Schedule] col·enemy·hp·t — Schedule<EnemyDeath> 호출 영역 검증
- [EnemyDeath][Execute] enemy·collider.enabled·t — Execute 호출 영역 검증

회수 의무:
- 트리거: PD 사망 원인 확정 직후
- 책임: 본 PM (집행 PM)
- commit 메시지 약속: revert(BT12-Dev): AttackHitbox·EnemyDeath 진단 Debug.Log 회수

PD 결정 (2026-05-10): "A+B 진행해" — A 진단 Debug.Log 추가.
pm-auditor 통과 + Minor 1 (회수 트리거 명시) + Improvement 1 (_collider 동시 캡처) 수용.
2026-05-10 00:24:21 +09:00
깃 관리자 d27a63f32e diag(BT12-Dev): Projectile.OnTriggerEnter2D 진단 Debug.Log 추가 — 적 피격 X 근본 진단
목적:
- 본 PM 가설 4회 누적 부정확 + 회귀 1회 → feedback_pm_root_diagnosis_priority 의무 적용
- 가설 즉시 중단·실측 우선 진단 도구 추가
- PD Play 영역 Console [Projectile] prefix 필터 → 호출 여부·other 정보·각 분기 reach·return 시점 정확 진단

진단 Debug.Log 영역 (prefix [Projectile][...] 통일·grep 영역):
- [Enter] OnTriggerEnter2D 진입 영역 (other.name·layer·t)
- [Return] _hitTargets duplicate
- [Return] PlayerController detected
- [LayerCheck] enemyLayer·otherLayer·hasEnemyController·isEnemy
- [Return] not Enemy
- [Return] Health component missing
- [Return] Health not alive (hp 정보)
- [Hit] damage 적용

회수 의무:
- PD Console 결과 수령 + 근본 fix 적용 후 본 진단 Debug.Log 일괄 제거 (대화로그 영역 명시)

PD 결정 (2026-05-09): "A 안으로 해" — 진단 Debug.Log 즉시 추가.
pm-auditor 통과 (조건부) + 권고 4종 수용.
2026-05-09 23:46:05 +09:00
깃 관리자 9eebbec03a fix(BT12-Dev): 직전 Kinematic Rigidbody2D 회귀 정정 — Static vs Kinematic Trigger 정합 복원
회귀 사실 (C3 자진 고지):
- 직전 fix `fe65592` Projectile Rigidbody2D Kinematic 추가
- Enemy = KinematicObject 상속 → Rigidbody2D Kinematic
- → Kinematic vs Kinematic + useFullKinematicContacts=false (기본값)
- → OnTriggerEnter2D 발화 X → 적 피격 X 회귀

근본 원인:
- C39 위반 — Enemy Rigidbody2D type 사전 실측 X
- KinematicObject.cs:76 영역 Read X·라이프사이클 검증 X

해결 (옵션 C — 단순 회귀):
- ProjectileSpawner.CreateFallbackProjectile 영역 Rigidbody2D 추가 영역 5 라인 제거
- Static Collider + Enemy Kinematic Rigidbody2D = OnTriggerEnter2D 발화 정합 복원
- `33eaa55` 시점 동작 정합 영역 복원 (DebuffStackLimit 정정 영역 그대로 유지)

자성 추가:
- 헌법급 feedback `feedback_new_code_existing_system_dependency_unmeasured` 신설
- 신규 코드 영역 기존 시스템 의존성 미실측 금지 (재발 차단 3 단계)

PD 보고 (2026-05-09 3차): "여전히 적이 플레이어의 투사체에 피격되지 않아" 회귀 정정.
2026-05-09 22:41:44 +09:00
깃 관리자 fe6559238f fix(BT12-Dev): 결함 2건 동시 fix — DebuffStackLimit 의도 정합 + Trigger 판정 안정성 보강
결함 1 — DebuffStackLimit 무차별 3 적용 (5 asset):
- 본 PM Phase 2-C placeholder 작성 시 ScriptableObject 모든 필드 무차별 채움
- StatusApplier.cs:43 가드 통과 → A01·A02·A03·A14·A15 hit 시 의도 외 DebuffStack 트리거
- 기획서 위반 (대화로그 엔트리 4 의도)

해결:
- A01 마법 화살 (단일 타격) — DebuffStackLimit 3→0
- A02 파이어볼 (DoT) — DebuffStackLimit 3→0
- A03 봉인 마법 (Stun) — DebuffStackLimit 3→0
- A08 저주의 화살 — DebuffStackLimit 5 유지 (DebuffStack 의도 정합)
- A14 얼음 창 (Slow) — DebuffStackLimit 3→0
- A15 추적 화염구 (DoT Homing) — DebuffStackLimit 3→0

결함 2 — fallback Projectile Rigidbody2D 부재:
- Unity 2D OnTriggerEnter2D 발화 의무 = 한쪽 Rigidbody2D
- transform.position 이동 영역 Physics2D 동기화 안정성 부족

해결:
- ProjectileSpawner.CreateFallbackProjectile에 Kinematic Rigidbody2D 추가
- gravityScale 0·CollisionDetectionMode2D.Continuous

PD 결정 (2026-05-09): "3 동시 진행해" — 옵션 3 결함 1+2 동시 적용.
pm-auditor Conditional Pass + Major 1 (feedback 헌법급 신설) + Improvement 2 수용.
2026-05-09 22:12:51 +09:00
깃 관리자 33eaa55c60 fix(BT12-Dev): 잔존 투사체 근본 해결 — fallback Scene GameObject Instantiate 패턴 정정
근본 원인:
- Resources/Skills/Projectiles/Default.prefab 부재
- LoadProjectilePrefab fallback이 new GameObject로 Scene 영역 GameObject 생성·반환
- ProjectileSpawner.Trigger가 이를 prefab으로 Object.Instantiate
  → 사본은 정상 SelfDestruct
  → 원본 Scene GameObject는 Initialize 미호출 → _lifetime Invoke 미설정 → 영구 잔존

해결 (옵션 J):
- LoadProjectilePrefab은 Resources prefab만 반환 (부재 시 null)
- ProjectileSpawner.Trigger가 prefab null 시 CreateFallbackProjectile 직접 호출
- fallback 영역 매번 새 GameObject 직접 생성 (Instantiate X·자기 자신 발사체)
- 원본 Scene GameObject 잔존 패턴 근본 차단

검증:
- Glob 0건: Assets/Resources/Skills/Projectiles/ 부재 확인
- pm-auditor Pass + Minor 1 + Improvement 1 (회귀 위험 0건)

PD 보고 (2026-05-09): "맵에 투사체 하나가 영구적으로 남아있어" 근본 해결.
2026-05-09 21:50:02 +09:00
깃 관리자 b37b4a660b fix(BT12-Dev): HealthIsZero sender 가드 — Enemy 사망 시 Player 즉사 버그 근본 해결
근본 원인:
- Health.Decrement·Die 4곳에서 Schedule<HealthIsZero>() (sender 미구분) 발화
- HealthIsZero.Execute가 health 영역 검증 없이 무조건 Schedule<PlayerDeath>()
- BT12-Dev Phase 2-B 투사체가 사상 처음 Enemy.Health.Decrement 호출
  → Enemy의 HealthIsZero가 처음 발화 → 무차별 PlayerDeath 직결 노출

해결:
- HealthIsZero.Execute에 PlayerController 보유 Health 검증 가드 추가
- PlayerController 보유 Health만 PlayerDeath 발화 (1줄 fix·근본)

검증:
- PD Console StackTrace t=5.18 Enemy hp=0 → t=5.19 Player Die() 1ms 직결 패턴 종결 의도

PD 지시 (2026-05-09): 1 즉시 적용.
2026-05-09 21:41:12 +09:00
깃 관리자 e31c34cf24 feat(BT12-Dev): SkillInventoryHUD 시각화 + 사망 원인 디버그 로그 (PD 후속 지시 2건)
PD 직접 발화 2건:
1. PlayerSkillInventory 등록 시각화 (유니티 기본 자원 활용)
2. 스킬 습득 후 사망 버그 수정

작업 내용:
- SkillInventoryHUD.cs 신규 (OnGUI 좌상단·장착 액티브 DisplayName/Lv/CD·패시브 카운트)
- PlayerController.Awake에 HUD 자동 부착
- ProjectileSpawner fallback prefab 시각화 (SpriteRenderer + 16x16 동적 흰색 원 + 속성별 색상)
- Projectile.OnTriggerEnter2D Player 명시 차단 (defensive proxy)
- Health.Decrement·DecrementSilent·Die에 Debug.Log + StackTrace (사망 호출자 추적)

가설 (미검증): BT5-Dev EnemyController patrol → PlayerEnemyCollision Event → player.health.Decrement().
검증 절차: PD Play 테스트 → Console log StackTrace 분석 → 호출자 확정.

pm-auditor Major 1 정정 완료 (PD 지시 로그 2행 등재)·Minor 2 정정 완료.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 21:23:25 +09:00
깃 관리자 d53150b5ed feat(BT12-Dev Phase 2-D): BT12-MVP-A 통합 정정 (placeholder → 정식 ActiveSkillData) + Phase 2-B .meta 보충
C49 Phase 2-D — Sonnet 위임 (코드 Write·검증만·git 본 PM 처리 정합·feedback_pm_sonnet_subagent_unauthorized_push 정합).

수정 6 파일:
- LevelUpManager.cs (Phase 2-D 정정·_pool 제거·SkillRuntimeFactory.RandomDraw3·HandleCardConfirmed(ActiveSkillData)·PlayerSkillInventory.AddSkillByCardId)
- SkillSelectionUI.cs (Show(List<ActiveSkillData>)·_selected·BindSlot·OnCardSelected ActiveSkillData 전환)
- SkillCardSlot.cs (Bind(ActiveSkillData)·DisplayName/Description/Icon PascalCase·rarity 배너 갈색 고정)
- PlayerController.cs (PlayerSkillInventory 자동 부착·line 100)
- Projectile.cs (Layer Enemy 미등재 fallback — EnemyController 컴포넌트 검사·proxy)
- SkillRuntimeFactory.cs (RandomDraw3 메서드·Active 카테고리 무작위 3장)

신규 9 .meta (Phase 2-B Sonnet 자율 push 영역 영역 영역 영역 X·Unity Editor Refresh 후 자동 생성·본 commit 보충):
- Skills.meta + Effectors.meta + 7 Effectors/*.cs.meta

Layer Enemy 영역 = proxy 개선 신호 (C2-2):
- 현 시점 = Projectile.OnTriggerEnter2D 영역 EnemyController 컴포넌트 fallback (proxy)
- 근본 해결안 = Layer "Enemy" 정식 등재 (별도 PD 안건·후속)

기능:
- 적 처치 → EXP +1 → 즉시 레벨업 → 카드 3장 노출 → 선택 → PlayerSkillInventory 등록 → ActiveSkillRuntime Tick → 1.5s 영역 자동 발사 + 부가 효과 (DoT·Stun·Slow·DebuffStack)

기존 영역 변경 X (BT5-Dev·BT7-Dev·Phase 2-A·2-B·2-C·BT12-MVP-A asset 5장·Scene·SkillCardPlaceholder·SkillCardPlaceholderPool·deprecate 차후)

Compile error 0건 (read_console·도메인 리로드 정합)

C49 — Phase 2-D Sonnet 위임 + Phase 3 본 PM 직접 (단순 반복 카탈로그 v1)
C50 — ~95K (PD 사전 승인 70~95K 영역 상한 정합)
C19-2 — Sonnet 자율 git X·본 PM 직접 commit·push (feedback 정합)

pm-auditor 사전 감사 = Pass + Minor 1 (Layer fallback proxy 명시·본 commit + 대화로그 영역 정정 적용)

후속:
- Phase 2-A·2-B·2-C·2-D 영역 PD Play 검증 (자동 발동·레벨업·카드 선택·등록·Tick)
- Layer "Enemy" 정식 등재 (별도 PD 안건·근본 해결안)
- Phase 2-E EditMode 테스트
- 다른 카테고리 (B·C·D·E·F) 영역
- BT12-MVP-A asset 5장 deprecate (차기)
- Screenshots·_Recovery .gitignore (별도)
2026-05-09 20:57:28 +09:00
깃 관리자 2f2790ce57 feat(BT12-Dev Phase 2-B): 투사체 카테고리 6종 효과 발동기 구현
- Effectors/IEffector.cs: 효과 발동기 공통 인터페이스
- Effectors/Projectile.cs: Line 직선 투사체 (단일 적 타격 후 소멸)
- Effectors/HomingProjectile.cs: Homing 유도 투사체 A15 (FindNearestEnemy)
- Effectors/ProjectileSpawner.cs: IEffector 구현 — 다중 발사·궤적 분기
- Effectors/StatusApplier.cs: DoT·Stun·Slow·Knockback·DebuffStack 통합 적용기
- Effectors/DebuffStack.cs: A08 저주 스택 N회 폭발 레지스트리
- Effectors/EnemyStateComponents.cs: DoT·Stun·Slow MonoBehaviour 통합
- Events/SkillFireEvent.cs: Execute stub → ActiveCategory.Projectile 분기 정식 연결

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 19:00:27 +09:00
깃 관리자 87710bac58 docs(BT12-Dev Phase 2-A): Skills 13 파일 신규 (인터페이스·SO·중앙 컴포넌트)
C49 Phase 2 (집행) — Sonnet 위임 결과·Phase 1 dev-team-lead 재분석 보고서 정합.

신설 13 파일 (Assets/Scripts/Skills/):
- Interfaces/ (4): ISkillRuntime, IActiveSkill, IPassiveSkill, IAwakeningSkill (+ ActiveTrigger·PassiveTriggerKind·AwakeningPattern enum)
- Data/ (4): SkillDataAsset (abstract·AttributeTag·TypeTag), ActiveSkillData (Category 6종·14 신규 필드), PassiveSkillData (StatType·stub), AwakeningSkillData (stub)
- Runtime/ (4): PlayerStats (POCO·AttributeTag Dictionary), ActiveSkillRuntime (Tick·Fire·EffectiveCooldown 하드캡 0.5s·StackLevelFactor), PlayerSkillInventory ([RequireComponent(Health)]·OnDamagedEvent 구독·NotifyEnemyKilled), SkillRuntimeFactory (Resolve·Create·stub 2종)
- Events/ (1): SkillFireEvent (Simulation.Event<T>·Execute stub·카테고리 분기 6종 주석)

설계서 정합:
- §2-1 인터페이스 계약 (ISkillRuntime → IActiveSkill·IPassiveSkill·IAwakeningSkill)
- §2-2 ScriptableObject 계약 (ActiveCategory 6종·CreateAssetMenu 3종)
- §2-3 PlayerStats POCO·AttributeTag 키 Dictionary
- §3-2 CSV 매핑 테이블·§3-3 Resolve+Create 분기
- §4-2 EffectiveCooldown = BaseCooldown × CooldownMultiplier ÷ StackLevelFactor·하드캡 0.5s
- §4-4 OnHit·OnKill 이벤트 핸들러 PlayerSkillInventory 구현

설계서 대비 조정 3건 (Sonnet 자체 정합):
1. IPassiveSkill.ApplyTo → ApplyModifier·RemoveModifier (설계서 §2-1 명세 정합)
2. AddSkillByCardId 반환 void → bool (실패 감지)
3. EnemyKillContext struct 신설 (Phase 2-D 정식 통합 전 decoupling)

Phase 2-B 준비:
- SkillFireEvent.Execute stub 영역 카테고리 분기 6종 주석
- Phase 2-B 투사체 진입 시 ProjectileSpawner·AttackHitbox 연결 지점 명확

기존 파일 영역 변경 X (BT12-MVP-A·BT5-Dev·BT7-Dev 미변경)
회귀 위험 = 매우 낮음 (신규 파일만)

C50 분량 (PD 사전 승인 80~120K) — 실제 ~73K (정합)
PD 결정 (b 5분할·b-1 카테고리 6분할·우선 투사체) 사전 승인 정합

pm-auditor 사전 감사 = Pass 4 + Minor 1 + Major 1
- Major 1 정정 영역 = git add 명시 path 한정 (Skills 디렉토리만·Screenshots·_Recovery 미포함) 
- Minor 1 후속 영역 = PD Editor Refresh 후 read_console 본 PM 직접 실측

untracked 영역 별도 안건:
- Assets/Screenshots/ (manage_camera screenshot 영역·.gitignore 검토 영역)
- Assets/_Recovery/ (Unity 자동 복구 파일·.gitignore 검토 영역)
2026-05-09 18:31:38 +09:00
깃 관리자 2783c15d56 docs(BT12-MVP-A Phase 2-B B+C·2-1·2-2 통합 완료): SkillSelectionCanvas Prefab + Scene 통합 + 한글 폰트 + 디자인 정정
산출물 (D안 — 기능 우선·그래픽 디테일 차후):

Prefab (신규):
- Assets/Prefabs/UI/SkillSelectionCanvas.prefab — 28 GameObject·Canvas Screen Space-Overlay·Sort Order 200
  - SkillSelectionPanel (anchor stretch·반투명 검정 RGBA(0,0,0,0.78))
  - Header (top stretch 120·베이지 9-slice·"기술 선택" 한글)
  - CardArea (center 1000x700·HorizontalLayoutGroup·SkillCardSlot ×3)
  - Footer (bottom stretch 200·"남은 포인트"·"확인" 노랑 버튼)
  - SkillCardSlot 자식 (TopBanner 갈색·NameText 흰색·IconArea·LevelText/DescriptionText 갈색·ClickArea·HighlightFrame)

한글 폰트:
- Assets/Fonts/NotoSansKR-Regular.ttf (Apache 2.0·Google Noto Sans CJK KR)
- Assets/Fonts/NotoSansKR-Regular SDF.asset (Multi Atlas·Dynamic mode·atlas 2x 2048)
- Assets/TextMesh Pro/Resources/TMP Settings.asset (fallback NotoSansKR 등록)

Scene 영역:
- [LevelUpManager] GameObject + LevelUpManager·SkillCardPlaceholderPool 영역
- Pool _allCards 5 asset 매핑 (A01·A05·P01·P12·AW01)
- LevelUpManager _pool/_ui 영역 매핑
- SkillSelectionCanvas Prefab 인스턴스 영역 SkillSelectionUI 8 field (_rootPanel·_titleText·_slot1·2·3·_pointText·_confirmButton) 영역 매핑

스크립트 (Debug.Log 추가·차후 가드 처리 의무):
- ExperienceSystem.cs (DEFAULT_XP_REWARD 5→1 임시·OnEnemyKilled 진단 Log)
- PlayerProgression.cs (GainXP·LEVEL UP 진단 Log)
- LevelUpManager.cs (HandleLevelUp·_ui.Show 호출 진단 Log)
- LevelXPTableLoader.cs (GetXPToNextLevel return 1 임시·기능 테스트 영역)
- SkillSelectionUI.cs (Awake·Show 진단 Log + gameObject.SetActive 영역)

회귀 영역 정리:
- Phase 2-B B+C MCP 작업 시 SkillSelectionPanel 자식 영역 중복 (Header/CardArea/Footer × 2 + 빈 Panel2) 영역 발견·정리
- Canvas WorldSpace → ScreenSpaceOverlay 정정 (Phase 2-2 manage_components silent fail 영역)
- Image color RGBA(1,1,1,1) → RGBA(0,0,0,0.78) 정정 (execute_code 영역 직접 변경)
- Player·SpawnPoint 영역 BT5-Dev 영역 정상 (본 PM 임시 변경 영역 stash 보존)

본 PM 자성 (영구 등재 의무):
1. manage_components set_property silent fail (Color·RectTransform·Canvas) — execute_code 영역 직접 변경 + 호출 직후 검증 의무
2. manage_gameobject batch 결과 검증 X — ReadMcpResource 호출 후 자식 영역 정합 검증 의무
3. 본 BT 영역 외 영역 임의 변경 금지 (Player·SpawnPoint·Camera·Tilemap·BT5-Dev)
4. TMP_FontAsset 검증 = characterTable.Count만 단정 X·isMultiAtlasTexturesEnabled·atlasPopulationMode·TryAddCharacters 동작 확인 의무
5. "영역" 어휘 무차별 부착 자제 (feedback_pm_filler_word_overuse)
6. PD 명시 외 임의 추가 (한자) 금지

PD 결정 (D안):
- 기능 검증 우선 (한글 표시·카드 UI·레벨업 흐름 정합)
- 그래픽 디테일 (PD 첨부 SD UI 정합) = 차기 BT 영역 후속 (Asset Store sprite 영역 또는 디자이너 영역)

C49 표준 — Phase 1 dev-team-lead 설계 + Phase 2 본 PM MCP 집행 + Phase 3 본 PM 직접 검증 (단순 반복 카탈로그 v1)
2026-05-09 18:00:27 +09:00
깃 관리자 402c416549 auto: 2026-05-08 22:14 · scene: Lobby · 125 files 2026-05-08 22:14:06 +09:00
깃 관리자 5b2b753784 BT12-MVP-A Phase 2-B (코드): SkillSelectionUI + SkillCardSlot + LevelUpManager UI 통합
PD 직접 지시 2026-05-08 — Phase 2-A 검증 우선 + Phase 2-B 진행. 본 응답 = 코드 영역.

신규 영역 (2 파일):
- Assets/Scripts/MyUI/SkillCardSlot.cs — 단일 카드 슬롯 (PD 예시 정합)
  · 1. 상단 색상 배너 (등급별: 청록 Common · 노랑 Rare · 빨강 Max)
  · 2. 카드 이름 (한글)
  · 3. 원형 아이콘 + 동심원 빛 효과
  · 4. 레벨 N / 최대 (빨강 강조)
  · 5. 효과 설명 3~4 라인
  · 클릭 영역 + 선택 highlight
- Assets/Scripts/MyUI/SkillSelectionUI.cs — 스킬 선택 화면 (PD 예시 정합)
  · 헤더: '기술 선택' 타이틀 + X 닫기 버튼
  · 본체: 카드 3장 가로 배치 (SkillCardSlot ×3)
  · 푸터: '남은 포인트: N' + '확인' 버튼
  · 인터랙션: 카드 클릭 → 선택·highlight / 확인 → onConfirm 콜백 / X → 첫 카드 자동 fallback

기존 수정 (1 파일):
- Assets/Scripts/Progression/LevelUpManager.cs
  · _ui 필드 (SkillSelectionUI) 추가
  · HandleLevelUp → _ui.Show(cards, level, HandleCardConfirmed) 정식 호출
  · UI 부재 fallback 영역 (placeholder asset 미등록 시)
  · HandleCardConfirmed → _ui.Hide() + 게임 재개

TMPro 영역: Unity 6 com.unity.ugui 2.0.0 통합 — 별도 패키지 X.

Phase 2-B 다음 세그먼트 (별도): placeholder asset 5장 + Canvas Prefab + Scene [LevelUpManager] 통합.
2026-05-08 18:00:18 +09:00