PD 직접 지시 2026-05-12: "정상 동작 시점으로 되돌린 다음 다시 판단"
- 정상 동작 시점: 6c981ed → 16aa6f9 push 정합 (Variant 6개 SpriteRenderer 종별 idle01 override)
- 회귀 commit 22개 (16aa6f9..5f360ca) 일괄 환원
근본 원인 (Play 측정 확정):
- Player.Health.IsAlive=False·ResurrectPromptUI.showPrompt=True·Time.timeScale=0
- 시작 직후 Player가 Enemy와 충돌해 사망 → 부활 prompt가 timeScale=0 → 모든 frame 정지
- Enemy 코드 자체는 정상 (Rigidbody2D Kinematic·body 연결·CF useTriggers=False·IsGrounded=True)
- 본 PM이 5f360ca까지 누적한 Enemy 측 변경은 헛짚음
16aa6f9 시점 기반 위에 PD 요구 사항 (Visual 자식 분리·Variant 종별 patrol 동작·발판 가장자리 회피 등)을
한 단계씩 점진 재적용·각 단계 Play 실측으로 회귀 차단 예정.
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: "몬스터 종별 개별 prefab"·"렉 최적화"
1. Enemy.prefab → Variant 6개 신규
- Enemy_M001_Wolf·M002_Bat·M003_ZombieM·M004_ZombieF·M005_Ghost·M006_Spider
- 각 Variant Animator.runtimeAnimatorController = M00x.overrideController 직접
- MonsterRandomizer 컴포넌트 제거 (종별 prefab 영역 자체 결정)
2. Scene 16 Enemy 종별 균등 배치
- Wolf 3·Bat 3·ZombieM 3·ZombieF 3·Ghost 2·Spider 2
- 기존 16 instance 폐기·새 Variant 영역 동일 위치 spawn
3. 렉 최적화 — Token 활성 50 → 10
- 발판 18개 중 10개 균등 선택·각 발판 위 1 Token
- 90개 비활성 (Sample Microgame IdleLit Light·Animator 영역 영역 영역)
- Profiler Editor unfocused 정확 측정 한계 — 가장 큰 cost 후보 (Light 100→10) 우선 정정
회귀 영역 X:
- Player·Enemy 충돌·발판 통과·OverrideController·Camera·Background 정합
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>
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-08):
1. 몬스터 이동속도 너무 빨라 2배 느리게
2. 벽 가장자리 미세 밀림 → 낭떠러지 떨어짐
3. 낭떠러지 근처 생성 Enemy 이동 중 떨어짐
정정 (BT86):
1. AnimationController maxSpeed 7 → 3.5 (Enemy.prefab):
- frame당 이동 거리 ~0.117m → ~0.058m (2배 느림)
2. stuckTimer 영역 임계값 정정:
- 거리: |transform.x - _lastX| < 0.01 → 0.02 (미세 밀림 검출)
- 시간: stuckThresholdTime 0.5 → 0.3 (빠른 phase 전환)
- stuckMoveThreshold Inspector 영역 신규
3. 절벽 검출 영역 정정:
- cliffCheckDistance: 0.6 → 0.3 (더 빠른 검출·낭떠러지 근처 보호)
- 시작 위치 복귀 영역 폐기 → 다음 phase 강제 (시작 위치도 절벽 가능 가설)
효과:
- Enemy 이동속도 2배 느림
- 미세 밀림 (< 0.02m/frame) = stuckTimer 누적 → 0.3초 후 phase 전환
- 절벽 영역 = 즉시 다음 phase (반대 방향 patrol) — 시작 위치 복귀 X
- 낭떠러지 근처 생성 Enemy = 절벽 영역 검출 → 즉시 반대 방향
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):
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 명시 (2026-05-08): "게임 내 모든 몬스터를 늑대로"
1차 단순 진행 (정지 시점 sprite만 교체):
- Enemy.prefab m_Sprite = EnemyIdle.png(fe68c6e1...) → M001_idle01.png(f7b7e5d5...)
- 시각상 정지 시점 = 늑대 idle 첫 frame
2차 후속 권고 (PD 결정 영역):
- EnemyIdle/Run/Hurt/Death .anim 영역 sprite reference 영역 교체
- EnemyIdle.png GUID(fe68c6e1...) → M001_idle 4 frames
- EnemyRun.png 영역 → M001_run 5 frames
- EnemyHurt.png 영역 → M001_hit 2 frames
- EnemyDeath.png 영역 → M001_death 4 frames
- attack 영역 신규 .anim 영역 작성 가능 (M001_attack 4 frames)
- Enemy.controller 영역 .anim 참조 영역 변경 또는 AnimatorOverrideController 영역 신규
M001 sprite GUID 카탈로그 (.anim 교체 시 사용):
- idle: f7b7e5d5d35e8ea4a9574fc970089486 / eb4754ac8816180459f43ea0d2be515d / f8a4b8c30ad9dc0479c2a21f635975c0 / f8519f10c50debc448559483e0af1b42
- run: 87e0e7df.. / bff83363.. / f70891b2.. / 8b2f5697.. / 4d71cfb9..
- hit: 37b18867.. / 0e93511696..
- death: 5e56e0e8.. / 8d913271.. / e9529e37.. / 17c76eeb..
- attack: c0df76ac.. / eff1bf43.. / 2b3fa48e.. / 23f76537..
후속 의무:
- PD Refresh+Play 시각 검증 (정지 sprite = M001_idle01 정합)
- 2차 .anim·controller 영역 교체 결정 (PD 명시)
PD 강한 어조 (2026-05-07): "이전에는 잘 되었는데 왜 복구를 못하는거야?"
본 PM git diff 1024e08(BT47) vs HEAD 직접 진단:
- Player.prefab BoxCollider2D = 유일 핵심 차이 (BT56 변경)
- GameOptimizer.cs = BT49 None 차단 + BT51 사후 복원 추가 (restored=0 영향 X)
- PlayerController.cs = BT57 Debug.Log만 (영향 X)
- BT55 자동 분류 [BT55-MoveTiles] moved=1389 (BT47 정상 정합)
- Player Layer 13 / Foreground Layer 16 / Layer Matrix 13↔16 ON 모두 정합
= BT56 BoxCollider 변경이 발판 동작 영향 = 본 PM 가설.
정정 — BT47 정확 회귀:
- m_Size (0.4, 0.9) → (0.45, 1.15)
- m_Offset (0, -0.125) → (0, 0.1)
효과 (BT47 시점 PD 정합 영역 회귀):
- 발판 위 착지 ✅ (BT47 시점 정합)
- 점프 ascending 통과 ✅ (BT47 시점 정합)
- 좁은 통로 영역 = 1 cell 세로 통과 X 회귀 (BT56 의도 폐기)
좁은 통로 영역은 BT55+BT58 정합 확증 후 별도 정정 후속:
- 옵션 1: PD가 좁은 통로 영역 1 cell 세로 → 2 cell 세로로 변경 (게임 디자인)
- 옵션 2: BoxCollider 절충 영역 (예: 0.45×0.95) — 발판 영역 영향 미세
- 옵션 3: PD 결정
본 PM 가설 한계 자인:
- BT47 정확 회귀 = PD가 BT47 시점 정합 인식 영역
- 그러나 BT56 변경이 정확히 어느 영역에서 영향 X 영역 = 미식별
- PD Refresh+Play 시각 검증 의무
- 정합 시 BT55+BT58 결합 = 발판 동작 복원 + 숨겨진 통로 영역 별도 진단
PD 가설 (2026-05-07): "이 위치의 캐릭터 콜라이더 때문에 이동하지 못하는게 아닌지 체크 + 크기 조절"
진단 (본 PM 직접 read):
- 변경 전: m_Size (0.45, 1.15) + m_Offset (0, 0.1)
- Tile cell size = 1.0 (Unity 표준)
- 세로 1.15 > 1.0 = 1 cell 세로 통로 통과 X (Collider 머리·모자가 Tile 충돌)
- = PD 가설 정확
정정:
- m_Size: (0.45, 1.15) → (0.4, 0.9)
- m_Offset: (0, 0.1) → (0, -0.125)
근거:
- 가로 0.4 = 좁은 통로 통과 margin 0.6 (Tile 가로 1.0 기준)
- 세로 0.9 = 1 cell 통로 통과 margin 0.1 (Tile 세로 1.0 기준)
- offset y -0.125 = 모자 영역 제외·발 영역 정합 (sprite 1.43×1.43 중심 기준 발 영역)
효과:
- 캐릭터 모자 = Collider X = 좁은 통로 통과 가능
- 발판 위 착지 정합 (발 영역 Collider)
- Enemy 충돌 정합 (본체 영역 보존)
PD Refresh+Play 시각 검증 후 정합 시 BT55 + BT56 결합 효과 확증. 부정합 시 size·offset 미세 조정 후속.
본 PM 자인 (C5·C39·C44):
- BT5-Dev #1~#21 동안 Enemy.prefab m_Layer/m_TagString 영역 검증 X 누적
- Enemy의 m_Layer=13 (Player와 동일) + m_TagString=Player (Player tag 중복) = 진정한 근본
→ FindGameObjectWithTag("Player")가 Enemy 발견 + Layer 동일로 IgnoreCollision도 효과 X
- 본 PM이 추측·Bounds·Distance·IgnoreCollision·OneWay 영역 모두 = 도달 영역 외 정정
정정:
- Enemy.prefab m_Layer 13→14
- Enemy.prefab m_TagString Player→Untagged
- GameOptimizer Physics2D.IgnoreLayerCollision(13, 14, true) BeforeSceneLoad
영구 효과:
- FindGameObjectWithTag("Player") = Player.prefab만 발견 정합
- Player Layer 13 ↔ Enemy Layer 14 충돌 OFF = 통과 정합
- IgnoreCollision instance 영역 의존 X = 안전
본 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>