| **B** | AnimationClip 8종 정합 | **Pass** | 8 anim 모두 m_PPtrCurves Hero1 sprite 첫 프레임 guid 정합 (idle01·run01·attack01·combatidle01·jump01·hit01·resurrection01·death01 일치). LoopTime 정합 (Idle/Run/CombatIdle = 1, 나머지 5종 = 0). 신규 anim 3종 guid 충돌 0 |
| **C** | Health.cs 확장 검증 | **Pass** | 기존 API 전수 보존 (maxHearts·QuartersPerHeart·IncreaseMaxHearts·Heal·Decrement(int)·i-frame 0.6s) + 신규 4종 (Resurrect·이벤트 3종) + Animator null-safe 처리 (`if (animator != null)`) + BT12-Dev 미연관 주석 명시 |
| **D** | 신규 컴포넌트 2종 | **Pass** | HitInterruptGuard.cs StateMachineBehaviour OnStateEnter `ResetTrigger("hit")` 정합. PlayerStateTimer.cs MonoBehaviour 5초 타이머 + RequireComponent(PlayerController·Animator) + NotifyAttackFired 외부 API 정합 |
| **E** | EditMode 테스트 19건 | **Pass** | 12번 개정(Hero1Idle01Guid `78c7da0e2fc366543ae4ad5e3ceb1b94`) + 신규 6건(Player_Has_8_Motion_States·Player_Controller_Has_New_Parameters·Player_Hit_Interrupts_Protected·Player_CombatIdle_Timer_Component_Attached·Player_Death_To_Resurrection_Sequence·Health_Has_Resurrect_Method_And_Events) 모두 정합 |
| **J** | 회귀 위험 2건 점검 결과 | **Major** | 1번 controller YAML 정합 = 완전 통과. **2번 Health Animator 의존**: Enemy.controller에 `hit`·`dead`·`resurrect` Parameter 미존재 → Unity는 미존재 Parameter SetTrigger/SetBool 호출 시 logical no-op (silent ignore). 게임 동작 영향 0 (Enemy 사망 체인은 별 channel `Schedule<EnemyDeath>` AttackHitbox.cs:75). **단 Editor Console warning spam 가능성** (Unity 버전 의존) |
### Phase 4 진입 가능 여부
**조건부 통과 (Major 1건 — 후속 권고, 차단 영역 0건)**
- Critical 0건 — Phase 4 진입 차단 영역 없음
- Major 1건 — 회귀 위험 2번 영역. Enemy Animator parameter warning spam 가능성. 게임 동작 영향 0이므로 commit/push 진행 가능. PD Play 검증 시 Console warning 모니터링 권고
### 회귀 위험 2건 정밀 점검 결과
**1번 Player.controller YAML 정합** = 완전 통과
- 8 State 전수 존재 + 폐기 4 State 부재 + AnyState→Hit Transition 존재 + HitInterruptGuard MonoBehaviour 부착(guid 일치 정합) + AnyState→Hit `m_CanTransitionToSelf: 0` + Death→Resurrection→Idle 시퀀스 정합 + 모든 신규 fileID/guid 충돌 0건
**2번 Health.cs Animator 의존 — Enemy 영향**
- Enemy.prefab은 Animator + Enemy.controller 보유
- Enemy.controller Parameter = `velocityX`·`velocityY`·`hurt`·`death`·`grounded` (5종) — Player와 분리
- Enemy 사망 체인은 별 channel(`AttackHitbox.cs:75 Schedule<EnemyDeath>`)로 분리 — 영향 0
- **Major 잠재 리스크**: Editor Console에 매 데미지 1회 `Parameter 'hit' does not exist` warning 가능 (Unity 버전 의존). 게임 동작 영향 0. PD Play 검증 시 Console 모니터링 권고
### 검증 산출물
- 본 엔트리 (대화로그 추가)
- 매니페스트: `2026-05-07_131323` (target_files: 본 대화로그)
### 검증 토큰 사용량
~25K (C50 추정 20-30K 범위)
### Phase 4 후속 영역 (PM)
1. commit (개발팀장 서명 + Phase 1·2·3 산출물 + 본 검증 결과)
2. push (main)
3. PD Play 검증 인계 (검증 기대 동작 10건은 Phase 1 §14-3 영역)
4. (선택) Major 후속 — Enemy Health Animator parameter warning 차단 영역 별건 검토 (C2 근원적 해결 권고: Player 전용 Animator-aware Health 분리 또는 Enemy.controller `hit`/`dead`/`resurrect` Parameter 추가 또는 Health.cs Parameter 존재 가드)
| 5. PD 지시 SOT 갱신 | BT5-Dev 6단계 (CS0101 정정 + D 옵션) 추가 |
| 6. commit + push | (본 응답 후속) |
### 결정·근거 (C32)
#### 결정 1 — D 옵션 (백업 전수 삭제 + 명세 정정 + feedback 등록)
**근거 (C2 근본 해결)**: 백업 파일 = git 영역과 100% 중복 (`D:/EerieVillage` GitAutoSync 추적). `.cs.bak_*.cs` = Unity 컴파일 대상 → CS0101 직접 원인. C6-1 본래 = git 미추적 영역만 (xlsm·CSV·DB). 롤백 = `git checkout` 1줄.
#### 결정 2 — 헌법급 PM feedback (옵션 나열·결정 요청 폐기)
**근거**: 본 사건 PM 옵션 A/B/C 나열 → PD D 옵션 직접 명시 = PM 사고 회피 확증. PD 시간 낭비 + C36 자율 판단 영역 침해. C29·C36·C45·C47 정합. 단순 운영(파일·백업·정리·rename) = PM 즉시 처리. PD 가치 판단(게임 디자인·비즈니스)만 결정 요청.
| 기존 BoxCollider2D | Size 0.32 × 0.54 · Offset (-0.09, -0.14) — **이전 32×64 PNG 시점 영역 잔존, Hero1 1.43 단위 대비 22%** |
### 정정 (즉시 처리)
#### 1. PlayerController.cs spriteRenderer·animator 자식 fallback 추가
```csharp
spriteRenderer = GetComponent<SpriteRenderer>();
if (spriteRenderer == null) spriteRenderer = GetComponentInChildren<SpriteRenderer>();
animator = GetComponent<Animator>();
if (animator == null) animator = GetComponentInChildren<Animator>();
```
근거: 향후 Visual 자식 GameObject 영역으로 SpriteRenderer 분리 시에도 안전. 현 prefab 영역에서 영향 0 (직접 부착 시 GetComponent가 우선).
#### 2. Player.prefab BoxCollider2D 시각 정합 정정
| 필드 | 기존 | 정정 | 근거 |
|------|-----|-----|------|
| `m_Size` | (0.32, 0.54) | (0.45, 1.2) | Hero1 캐릭터 몸통 폭 30% × 높이 83% (PPU 300, 1.43 단위 sprite) |
| `m_Offset` | (-0.09, -0.14) | (0, -0.05) | sprite 중심 = 캐릭터 중심 정합 (캐릭터 발 sprite 95% 위치 → 중심 약간 아래) |
| `m_SpriteTilingProperty.oldSize/newSize` | (1.28, 1.26) | (1.43, 1.43) | Hero1 sprite 실제 크기 정합 |
### facing 동작 진단
`AnimationController.cs` Player.prefab 부착 0건 + anim에 `m_FlipX` curve 0건 → **PlayerController의 flipX 처리가 단독으로 동작해야 정합**. fallback 추가로 자식 SpriteRenderer 영역 안전망 보강. PD Play 검증 시 좌우 이동 → sprite 반전 동작 확인.
> "여전히 캐릭터가 반대방향으로 출력되고 있어. (리소스는 왼쪽을 보고 있지만 게임에서는 오른쪽이 기준이야.) 충돌 영역이 잘못된 것 같아. (캐릭터가 마치 공중에 떠있는 것처럼 스테이지 지면과 떨어져있고, 몬스터를 밟아서 공격할 수 없어)"
### PM 자인 (C5·C44)
엔트리 5에서 본 PM이 Hero1 idle01 시각 확인 시 "우측 향함"으로 판단 → 실제 = **좌측 향함**. C44 팩트 우선 위배. 시각적 판단 실패가 facing 로직·Collider Offset 결정에 직접 영향. 다음 작업부터 Hero1 sprite는 **좌측 default**로 확정.
### 정정 (즉시 처리)
#### 1. flipX 로직 반전 (PlayerController.cs line 153~159)
`facing = Vector2.right/left` 영역은 그대로 유지 (PlayerAttackTicker가 Schedule 시점 참조 — 게임 좌표계 기준).
#### 2. Player.prefab SpriteRenderer 디폴트 m_FlipX
- 기존: `m_FlipX: 0` (false) — 시작 시 좌측 default
- 정정: `m_FlipX: 1` (true) — 게임 시작 시 우측 향함 (PlayerController 디폴트 `facing = Vector2.right` 정합)
#### 3. Player.prefab BoxCollider2D Offset 양수
| 필드 | 엔트리 5 | 정정 (엔트리 6) | 근거 |
|------|---------|--------------|------|
| `m_Size` | (0.45, 1.20) | (0.45, **1.15**) | 캐릭터 vertical 영역 sprite 80% 재산정 (이전 83%) |
| `m_Offset` | (0, **-0.05**) | (0, **+0.10**) | 캐릭터 발 위치 sprite 85% (pivot center 기준 -0.50 단위). Collider 하단 = +0.10 - 0.575 = -0.475 ≈ 발 정합 (이전 -0.65 = 발보다 더 아래로 부유 원인) |
### 가설 검증 영역 (PD Play 재검증)
- flipX: 우측 이동 시 sprite 좌우 반전 → 우측 향함 시각 확인
- Collider: 캐릭터 발이 지면에 닿음 + 몬스터 위 충돌 가능 (밟기)
추가 보정 영역(있다면):
- Collider Size 재산정 (PD가 캐릭터 영역 시각 측정 후 보정 가능)
- pivot Bottom 변경 (37 sprite meta 일괄 — 별건 추후 정리 영역)
| 5 | `Health.cs` | `Resurrect()`에서 `invulnerableUntil = Time.time + resurrectInvulnerableDuration(2.0f)`. 부활 직후 i-frame 동안 측면 충돌 무시되며 위 밟기는 EnemyDeath 직접 호출이라 i-frame 무관 — 정합 |
### 자동 부착 영역 (Player.prefab 변경 0)
`PlayerController.Awake()`에서 `PlayerInvulnerabilityFlash`·`ResurrectPromptUI`를 `AddComponent` 자동 부착. Inspector 수동 작업 불요·prefab YAML 변경 0 = 회귀 영향 0.
### UI 임시 영역
`ResurrectPromptUI`는 OnGUI 임시 구현 (Canvas/uGUI prefab 신설 영역 회피). 미관·로컬라이즈는 향후 별건 정리.
## 엔트리 8. 밟기 점프 판정 강화·Bounce 1/3·낙사 위치 복귀·게임 최적화 (PD 지시 4건 일괄)
**시각**: 2026-05-07 14:49 ~
**주체**: 총괄PM (직접 처리)
**영역**: BT5-Dev #11
### PD 원문 (4건)
1. 밟기 = 점프 상태(공중)에서 적 상단 충돌 시만. 비점프 상태는 플레이어 피해
2. 밟기 후 튕김 높이 1/3
3. 화면 스크롤 시 버벅임 — 게임 최적화
4. 낙사 시 즉사 폐기 → HP 감소 + 가장 가까운 이동 가능 지역 복귀 + 1초 무적
### 처리
| # | 영역 | 변경 |
|---|------|------|
| 1 | `PlayerEnemyCollision.cs` | `stomped = !player.IsGrounded && player.velocity.y < 0 && player.Bounds.min.y >= enemy.Bounds.center.y`. 공중 + 하강 + 적 중심 위 = 3조건 충족 시 밟기. 그 외 i-frame 피격 |
| 2 | Enemy CapsuleCollider2D 일반 충돌 → Player 통과 X | Enemy.prefab `m_IsTrigger: 0 → 1` + EnemyController OnCollisionEnter2D → **OnTriggerEnter2D + OnTriggerStay2D** (Stay = 측면 닿은 상태로 점프 시 위치 갱신 감지). `Physics2D.queriesHitTriggers = false` (GameOptimizer 추가) → Enemy 자기 raycast 자기 Trigger 무시 = 지면 정합 보존 |
| 3 | DeathZone 즉시 위치 복귀 = 캐릭터가 사라지기 전에 순간이동 = 부자연스러움 | DeathZone Coroutine — `Camera.WorldToViewportPoint(p).y < -0.1` (카메라 영역 외)까지 대기 (timeout 3초 안전망). 대기 중 `controlEnabled = false`. 카메라 외 도달 시 위치 복귀 + HP 감소 + 1초 무적 |
## 엔트리 10. Enemy 등장 복원 + One-Way Platform (PM 변경 부작용 자인·재정정)
**시각**: 2026-05-07 15:03 ~
**주체**: 총괄PM (직접 처리)
**영역**: BT5-Dev #13
### PD 원문 (2건)
1. 갑자기 몬스터가 등장하지 않아 — 확인·수정
2. 점프·이동 시 지형 통과 가능. 점프 후 착지·걷기 시만 지면 통과 X (= One-Way Platform)
### PM 자인 (C5·C44)
엔트리 9에서 본 PM이 Enemy CapsuleCollider2D `IsTrigger=1` 변경 → **지면도 Trigger** = 지면 충돌 영역 외 → Enemy가 게임 시작 시 떨어짐 → 화면 안 보임. PD 변경 부작용 즉시 발견 안 함. 자인.
### 진단·정정
| # | 진단 | 정정 |
|---|------|------|
| 1 | Enemy IsTrigger=1 = 지면 통과 = Enemy 떨어짐 | Enemy.prefab `m_IsTrigger: 1 → 0` 복원 (지면 충돌 회복). Player 통과는 `Physics2D.IgnoreCollision(enemy._collider, playerCollider, true)` Awake 호출. Player 감지는 `_collider.bounds.Intersects(player.Bounds)` Update 매 프레임 |
| 2 | 일반 Tilemap Collider2D = 모든 방향 충돌 | `GameOptimizer.SetupOneWayPlatforms` 신규 — `RuntimeInitializeOnLoadMethod AfterSceneLoad`로 모든 `TilemapCollider2D`에 `usedByEffector=true` + `PlatformEffector2D(useOneWay=true·surfaceArc=180)` 자동 부착. 위에서만 착지·측면·아래 통과 |
## 엔트리 12. Distance 기반 단순 감지 + 기획팀 검증 운용 방안 (PM 자인·근본 영역)
**시각**: 2026-05-07 15:20 ~
**주체**: 총괄PM
**영역**: BT5-Dev #16
### PD 원문
> "그래서 어떻게 해야 제대로 동작하는건데? 똑바로 일해! 내 플레이에만 의지하지말고 기획팀에도 참여할 수 있도록 방법을 찾아봐."
### PM 자인
엔트리 11까지 본 PM 영역:
- 추측 + Debug.Log 추가 = PD에게 검증 떠넘김
- Bounds.Intersects 영역 산수 의존 — 100% 정합 보장 X
- Unity MCP 영역 본 세션 미활성 (Claude Desktop만 등록 BT3) → 본 PM 직접 Play 검증 X 영역
- 활용 가능 영역 미적극 활용
C5·C44·C2 근본 위배.
### 정정 영역 — Distance 기반 단순 감지 (Bounds 의존 폐기)
| 영역 | 변경 |
|------|-----|
| `EnemyController.cs` | hitRangeX(0.7)·hitRangeY(1.0)·stompMinDy(0.5) public 영역 신규. Update 감지 영역 = `Mathf.Abs(pPos.x-ePos.x) < hitRangeX && Mathf.Abs(dy) < hitRangeY`. dy 측정 후 PlayerEnemyCollision.dyAtCollision로 전달 |