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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
근본 원인 (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 영역 검증 영역 영역
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 ✅
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 영역 정합
근본 원인 (본 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 능동 활용 의무.
목적:
- 본 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종 수용.
회귀 사실 (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차): "여전히 적이 플레이어의 투사체에 피격되지 않아" 회귀 정정.
근본 원인:
- 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): "맵에 투사체 하나가 영구적으로 남아있어" 근본 해결.
- 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>
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] 통합.
PD 직접 지시 2026-05-08 — (b) 채택 + JSON 테이블 영역 관리.
신규 영역 (8 파일):
- Assets/Resources/Progression/level_xp_table.json — Lv 1~30 EXP 테이블 (balance-designer SOT)
- Assets/Scripts/Progression/LevelXPTableLoader.cs — Resources.Load + JsonUtility 캐시
- Assets/Scripts/Progression/PlayerProgression.cs — Level·EXP 진행도 (BT12-Dev v1 PlayerStats와 직무 분리)
- Assets/Scripts/Progression/ExperienceSystem.cs — EXP 발급 정적 게이트웨이
- Assets/Scripts/Progression/SkillCardPlaceholder.cs — placeholder ScriptableObject
- Assets/Scripts/Progression/SkillCardPlaceholderPool.cs — 카드 풀·Draw3Random
- Assets/Scripts/Progression/LevelUpManager.cs — 레벨업 발화·일시정지·UI placeholder (Phase 2-B 통합)
기존 파일 수정 (2 파일):
- EnemyDeath.cs Execute 마지막 영역 ExperienceSystem.OnEnemyKilled 호출
- PlayerController.cs Awake PlayerProgression 자동 부착
회귀 위험:
- BT5-Dev 발판/몬스터 영역 영향 X (EnemyDeath 호출 마지막·PlayerController 자동 부착)
- BT7-Dev VS 순수형 영향 X (Schedule 영역 변경 X)
- BT12-Dev v1 영역 충돌 X (PlayerStats 분리·신규 namespace EerieVillage.Progression)
Phase 2-A 영역 검증:
- 적 처치 → EXP 누적 → Lv 임계점 → Console [LevelUpManager] 영역 출력 확증
- Phase 2-B 영역 = SkillSelectionUI prefab + 5 placeholder asset + Scene 통합
PD 보고 2026-05-08: 일부 몬스터 이동 X.
Editor.log [Enemy@N] 직접 read 결과 — 16건 중 8~9건 maxR=0/maxL=0:
- footPos.y = bounds.min.y - 0.5f 영역 발판 cell 영역 미정합
- 인스턴스마다 collider bounds·sprite bounds 영역 변동
- startTm = NULL → maxR/maxL = 0 → patrol 거리 0 → 무한 정지
근본 정정: 다단 fallback 채택
- sprite/collider/transform 3 영역 각 후보
- 다중 offset (-0.1·-0.3·-0.5·-0.7·-1.0)
- 첫 HasTile cell 채택
- Debug.Log 강화 (startY·colliderFoot·spriteFoot·chosenFootY)