BurningTimesAi/공유/대화로그/EerieVillage/2026-05-07.md

727 lines
41 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# EerieVillage 대화로그 — 2026-05-07
---
## 엔트리 1. BT5-Dev Hero1 캐릭터 교체 + 캐릭터 리소스 규칙 SOT 신설 (PD 결정 5건 A안 일괄 채택)
**시각**: 2026-05-07 12:34 ~
**주체**: 총괄PM
**영역**: BT5-Dev 개발팀 단일 영역
**유형**: PD 직접 신규 지시 수령 + 매니페스트 등록 + pm-auditor 사전 감사 + SOT 신설 + 개발팀장 Opus Phase 1 설계 위임
### 배경
PD 직접 결정 (2026-05-07): 활성 PD 지시 4건 중 BT12-Dev·BT7-Plan·BT7-Dev 보류 + BT5-Dev 우선 진행 채택. 신규 지시 2건:
> **PD 원문 1**: "기존에 지시한 layerTestGirl 은 폐기하고, EerieVillage\Assets\Character\Sprites\Hero1 경로에 있는 캐릭터 스프라이트를 사용하도록 교체해줘."
> **PD 원문 2**: 캐릭터 리소스 규칙 7종 모션 직접 명세 (`C1_<motion><frame>` 형식, attack·combatidle·idle·hit·jump·resurrection·run + 상태 전환 룰: idle⇄combatidle 5초 타이머·hit 인터럽트 보호)
본 PM 실측 결과 정합성 이슈 5건 발견 → PD에게 보고 + 결정 요청.
> **PD 원문 3 (이슈 5건 결정)**: "일괄 진행해."
= 권고안 A 일괄 채택 해석.
### PD 결정 (5건 일괄 채택)
| 이슈 | 결정 (A안) | 근거 |
|------|----------|------|
| 1. 파일명 공백 (`combat idle` ↔ `combatidle`) | A — 파일 rename | Unity asset 공백 미허용 + 파싱 안정성 |
| 2. death 자산 2종 처리 | A — 모션 8종 확장 | death + resurrection 시퀀스 정합 |
| 3. jump 1프레임 | A — 단일 프레임 정합 채택 | 자산 정합 + 간소함 |
| 4. 기존 Player*.png 9종 | A — `_archive/` 백업 + Hero1 단독 사용 | 롤백 안전망 |
| 5. Land·Spawn·Victory 모션 | A — 미사용 (jump 자세 유지·idle/resurrection 진입·미구현) | Hero1 7종으로 충분 |
### 본 PM 집행 결과 (본 응답 시점)
| 단계 | 처리 | 결과 |
|------|-----|-----|
| 1. pm-auditor 사전 감사 (C35-9) | Task 호출 | ✅ 통과 (Critical 0·Major 0·Minor 1·Improvement 2) |
| 2. C37-1 중복 감지 Grep | 캐릭터·리소스·네이밍 규칙 SOT 검색 | ✅ 중복 0건 |
| 3. 매니페스트 등록 | `2026-05-07_123431` | ✅ target_files 3건 차단 해제 |
| 4. PD 지시 SOT 갱신 | `개발팀_PD_지시_로그.md` BT5-Dev 활성 지시 5단계 추가 | ✅ |
| 5. 캐릭터 리소스 규칙 SOT 신설 | `프로젝트/EerieVillage/개발/spec/캐릭터_리소스_규칙_v1.md` | ✅ 영구 SOT |
| 6. 본 대화로그 엔트리 작성 | `공유/대화로그/EerieVillage/2026-05-07.md` | ✅ 신설 |
| 7. 개발팀장 Opus Phase 1 설계 위임 | C49 1단계 | ⏳ 본 응답 후속 단계 |
### 결정·근거·영향 (C32)
#### 결정 — PD 결정 5건 A안 일괄 채택 + C49 표준 프로세스 진행
**근거**:
- 권고 A안은 모두 자산 정합·롤백 안전·관행 정합 우선 — PD "일괄 진행" = 본 PM 권고 신뢰 표명
- C49 표준 프로세스 (팀장 Opus 설계 → 팀원 Sonnet 작업 → 팀장 Opus 검증) BT12-Dev에 이어 BT5-Dev 영역 시범 적용
- C50 토큰 추정 ~120-205K 사전 보고 완료 (PD 묵시 승인)
**영향**:
- 캐릭터 리소스 규칙 v1 = 영구 SOT (향후 캐릭터 추가 시 표준 — C2·C3... 자동 적용)
- Player.controller 전면 재설계 + Health.cs 부활 시스템 추가 = 회귀 범위 ↑ (개발팀장 Phase 1 설계 단계에서 영향 분석 의무)
- BT7-Plan VS 순수형 자동 발동(공격 버튼 제거)과 정합 영역 확인 필요 — `PlayerAttackTicker.cs` 영역 변경 없음 정합
### 산출물 (본 응답 시점)
- `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` BT5-Dev 활성 지시 갱신 (5단계 Hero1 적용 추가)
- `프로젝트/EerieVillage/개발/spec/캐릭터_리소스_규칙_v1.md` (신설 — 영구 SOT)
- `공유/대화로그/EerieVillage/2026-05-07.md` 본 엔트리 (신설)
- `.claude/manifest/active/2026-05-07_123431.md` (매니페스트)
### 다음 단계 (본 응답 후)
- 개발팀장 Opus Phase 1 설계 위임 (Task 호출) — Hero1 meta 재작성 설계·Animator State Machine 재설계·Health.cs hit 인터럽트 보호·resurrection 시스템 추가·기각안 5건 이상
### 기각안 (C32 필수)
**기각안 1** — PD 결정 5건 일부만 채택 (예: 이슈 1 A·이슈 2 B 등 혼합)
- 사유: PD "일괄 진행" 명시 = 본 PM 권고 A 신뢰 표명. 일부만 채택은 PD 의도 반영 부정합
**기각안 2** — 본 PM 직접 Phase 1·2 모두 처리 (개발팀장 위임 없이)
- 사유: C48 3자문 통과 → C49 표준 프로세스 정합. Animator State Machine 재설계 + Health.cs 부활 시스템 = 개발팀 전문 영역. PM 직접 처리 시 C49 위반
**기각안 3** — 캐릭터 리소스 규칙 SOT 작성 후순위 (개발팀장이 Phase 1 설계 시 작성)
- 사유: SOT는 PD 명세 직접 반영 영역 = PM 영역. 개발팀장 위임 시 C36 PM 자율 판단 범위 상한 위배 위험
### 관련 규칙·자산
- C5·C13·C32·C35·C36·C37·C39·C42·C44·C48·C49·C50·P19·P32·P33 정합
- 매니페스트 SOT (나) `2026-05-06` 채택 + 본 등록 = 정합
- pm-auditor 의무 호출 = C35-9 정합
- C49 표준 프로세스 = BT12-Dev 시범 후 BT5-Dev 2회차 적용
---
## 엔트리 2. BT5-Dev Hero1 Phase 2 클라이언트팀 적용 (W1~W12 일괄 집행)
**시각**: 2026-05-07 12:53 ~
**주체**: 클라이언트팀 (Sonnet — C49 2단계 적용)
**영역**: BT5-Dev Unity 클라이언트 단독 영역
**유형**: Phase 1 설계(개발팀장 Opus) 위임 수행 + W1~W12 일괄 집행
### 집행 결과 (W1~W12)
| W | 내용 | 결과 |
|---|------|------|
| W1 | combat idle01~04 PNG+meta rename → combatidle | ✅ 4건 rename + meta name 필드 갱신 |
| W2 | AnimationClip 8종 신설/재작성 | ✅ 5종 재작성 + 3종 신설 + meta 3건 신설 |
| W3 | Player.controller 전면 재작성 (8 State + 8 Param + Transition) | ✅ |
| W4 | HitInterruptGuard.cs 신설 | ✅ StateMachineBehaviour + meta |
| W5 | PlayerStateTimer.cs 신설 | ✅ MonoBehaviour + meta |
| W6 | Health.cs 확장 (Resurrect + 이벤트 3종 + Decrement hit/dead + Die dead) | ✅ |
| W7 | PlayerAttack.cs 1행 추가 (NotifyAttackFired) | ✅ |
| W8 | Player.prefab (m_Sprite Hero1 idle01 + m_Color white + PlayerStateTimer 부착 + maxHearts 직렬화) | ✅ |
| W9 | 기존 sprite 9종 → _archive/ 이동 | ✅ 9 PNG + 9 meta |
| W10 | EditMode 테스트 13→19건 (12번 개정 + 신규 6건) | ✅ |
| W11 | PlayerController 실측 — combatidle Bool/jump = PlayerStateTimer/grounded 조건으로 처리 확인 | ✅ 변경 없음 정합 |
| W12 | 최종 정합 검증 (8 State 전수 OK + 8 Param 전수 OK + 폐기 4 State 부재 OK + prefab 정합 OK) | ✅ |
### C6-1 백업
- **timestamp**: `20260507_1253`
- **백업 9종**: Player.controller·PlayerIdle.anim·PlayerRun.anim·PlayerAttack.anim·PlayerJump.anim·PlayerDeath.anim·Player.prefab·Health.cs·PlayerAttackTests.cs
- _archive/ 이동 9종 = 백업 자체 (guid 보존)
### 변경 파일 (Unity 영역 — E:/EerieVillage)
**재작성**: `Assets/Character/Animations/PlayerIdle.anim`·`PlayerRun.anim`·`PlayerAttack.anim`·`PlayerJump.anim`·`PlayerDeath.anim`·`Player.controller`
**갱신**: `Assets/Scripts/Mechanics/Health.cs`·`Assets/Scripts/Gameplay/PlayerAttack.cs`·`Assets/Prefabs/Player.prefab`·`Assets/Tests/Editor/PlayerAttackTests.cs`
**meta 갱신 (W1)**: `Assets/Character/Sprites/Hero1/C1_combatidle01~04.png.meta`
### 신설 파일
- `Assets/Character/Animations/PlayerCombatIdle.anim` + .meta
- `Assets/Character/Animations/PlayerHit.anim` + .meta
- `Assets/Character/Animations/PlayerResurrection.anim` + .meta
- `Assets/Scripts/Mechanics/HitInterruptGuard.cs` + .meta
- `Assets/Scripts/Mechanics/PlayerStateTimer.cs` + .meta
- `Assets/Character/Sprites/_archive/` 폴더 + .meta
### Phase 1 설계 정합
- 8 State: Player-Idle·Run·Attack·Jump·Death·CombatIdle·Hit·Resurrection ✅
- 8 Parameter: velocityX·velocityY·grounded·attack·dead·hit·combatidle·resurrect ✅
- 폐기 4 State 부재: Player-Hurt·Land·Spawn·Victory ✅
- BT7-Plan 보존: PlayerAttackTicker 변경 0 · Health 기존 API 전부 보존 ✅
- BT12-Dev 미연관: ISkillRuntime 4종 주석 명시 ✅
### 매니페스트
- `plan_id`: `2026-05-07_125257`
- `target_files`: `공유/대화로그/EerieVillage/2026-05-07.md`
### C48 3자문
- Phase 3 검증 Task 호출 = 0회 (단계 분리 의무 준수)
### 회귀 위험
- `Player.controller` 전면 재작성 → Phase 3 개발팀장 YAML 정합 재검증 필요
- `Health.cs` Animator 의존 신규 추가 (`GetComponent<Animator>()`) — Enemy Health에도 동일 컴포넌트 구조이면 Enemy hit 발동 가능성 (Phase 3 영역)
### 토큰 사용량 추정
~180K (C50 사전 승인 범위 200K 이내)
---
## 엔트리 3. BT5-Dev Hero1 Phase 3 개발팀장 검증 (C49 3단계)
**시각**: 2026-05-07 13:13 ~
**주체**: 개발팀장 (Opus — C49 3단계 검증)
**영역**: Phase 2 적용분(엔트리 2) §A~§J 정합 실측 검증
**유형**: Unity 자산 직접 grep + Phase 1 설계 정합 + 회귀 위험 2건 점검 (수정 영역 0)
### §A~§J 검증 결과 등급
| § | 검증 영역 | 등급 | 핵심 결과 |
|---|---------|------|---------|
| **A** | Player.controller YAML 정합 | **Pass** | 8 State + 8 Param + AnyState→Hit + Player-Hit 부착 + Death→Resurrection→Idle Transition 모두 정합. 폐기 4 State 부재 확증. AnyState→Hit `m_CanTransitionToSelf: 0` 확증 |
| **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) 모두 정합 |
| **F** | Player.prefab 정합 | **Pass** | m_Sprite guid `78c7da0e...` = Hero1 idle01. m_Color = white. PlayerStateTimer 부착(guid `e5f6789012345678abcdef0102030405`) + combatIdleDuration: 5. maxHearts:1·maxHP:4 직렬화 |
| **G** | Hero1 폴더 + _archive | **Pass** | combat idle 4 PNG `combatidle01~04` rename 확증 (공백 제거). 기존 Player*.png 9 + meta 9 = 18 파일 `_archive/` 이동 확증. 폐기 4 anim guid (Hurt·Land·Spawn·Victory) Player.controller 참조 0건 |
| **H** | BT7-Plan/BT12-Dev 정합 | **Pass** | PlayerAttackTicker 변경 0 ([RequireComponent(PlayerController)] 보존). Health 기존 API 보존. PlayerAttack.cs:42-44 1행 NotifyAttackFired 추가만. ISkillRuntime 미연관 주석 명시 |
| **I** | C6-1 백업 9종 + _archive 9종 | **Pass** | timestamp `20260507_1253` 통일 9건 (Player.controller·5 anim·Player.prefab·Health.cs·PlayerAttackTests.cs). _archive 9 PNG + 9 meta 정합 |
| **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와 분리
- `hit`/`dead`/`resurrect` Parameter Enemy.controller에 미존재
- Health.Decrement → animator.SetTrigger("hit") 호출 시 Unity Animator는 silent ignore (예외 0)
- 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 존재 가드)
---
## 엔트리 4. CS0101 사건 + D 옵션 근본 해결 (Unity 백업 28 파일 일괄 삭제 + feedback 2종 등록)
**시각**: 2026-05-07 13:25 ~
**주체**: 총괄PM
**영역**: BT5-Dev 후속 정정 + 조직 학습 자산 영구 보존
**유형**: PD Editor 실행 시 CS0101 발견 → 본 PM A→D 옵션 분석 → PD "D 옵션 + 결정 요청 패턴 자체 폐기" 직접 지시
### 배경
Phase 3 검증 완료 + commit `13976e2` push 후 PD Unity Editor 실행:
> **PD 원문 1**: "에디터를 실행하니 아래와 같은 에러가 발생중이야. 당장 수정해. Assets\Tests\Editor\PlayerAttackTests.cs.bak_20260507_1253.cs(15,14): error CS0101..."
본 PM 즉시 4 파일 처리 (`.cs.bak_*.cs` → `.txt`) 후 잔존 14 파일 처리 옵션 A/B/C 나열 + PD 결정 요청.
> **PD 원문 2**: "백업 파일은 왜 만드는거지?"
= 백업 자체의 정당성 의문. 본 PM 답변에서 C6-1 적용 영역 오해 자인 + D 옵션(전수 삭제 + 명세 정정) 권고.
> **PD 원문 3**: "d 옵션으로 진행하고, 앞으로는 내게 이렇게 불필요한 결정을 요구하지 마. 먼저 생각하고 최적의 결과만 간결하게 보고하도록 해."
= D 옵션 채택 + **본 PM 보고 패턴 자체 헌법급 feedback** (옵션 나열·결정 요청 폐기·즉시 진행).
### PD 결정 (2건)
1. **D 옵션 진행** — 백업 전수 삭제 + Phase 1 §12 정정 + feedback 2종 등록
2. **헌법급 PM feedback** — 분석 명확 시 옵션 나열 금지·즉시 진행·간결 보고
### 본 PM 처리 결과
| 단계 | 처리 |
|------|------|
| 1. Unity bak_2026* 일괄 삭제 | 28 파일 (3 회차: 0423·0424·0507) 전수 (Count=0 검증) |
| 2. feedback 메모리 2종 등록 | `feedback_pm_excessive_decision_request.md` (헌법급) + `feedback_unity_backup_compile_pollution.md` (organizational) |
| 3. MEMORY.md 인덱스 2 라인 추가 | feedback 2종 매핑 |
| 4. Phase 1 §12 정정 | 백업 12종 → 0건 + git checkout 롤백 절차 + C6-1 적용 영역 명문화 |
| 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 가치 판단(게임 디자인·비즈니스)만 결정 요청.
### 산출물 (본 응답 시점)
- `memory/org/feedback_pm_excessive_decision_request.md` (헌법급, 신설)
- `memory/org/feedback_unity_backup_compile_pollution.md` (organizational, 신설)
- `memory/org/MEMORY.md` 인덱스 2 라인 추가
- `프로젝트/EerieVillage/개발/06_Hero1_적용_설계.md` §12 전면 재작성
- `공유/대화로그/EerieVillage/2026-05-07.md` 본 엔트리 추가
- `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` BT5-Dev 활성 지시 갱신
- `.claude/manifest/active/2026-05-07_133153.md` + `2026-05-07_133240_mem.md` (매니페스트 2건)
- Unity 영역 변경: bak_2026* 28 파일 전수 삭제 (3 회차: 0423·0424·0507)
### 기각안
- **A** 외부 디렉토리 이동 — 백업 자체 불요 영역. 위치만 옮긴 = 노이즈 잔존
- **B** 보존 — 잔존 누적 = git 중복 + Unity import 노이즈
- **C** 단순 일괄 삭제 (명세 정정·feedback 없이) — 동일 사건 재발 차단 효과 0
### 관련 규칙·자산
- C2 근본 해결 (proxy ≠ 근본)
- C6 데이터 보호 적용 영역 명확화
- C29·C36·C45·C47 (PM 자율 + 능동 추론 + 옵션 나열 폐기)
- 매니페스트 SOT (나) 정합
- 별건: `feedback_backup_filename_format_violation` (2026-04-19, 백업 포맷 영역 — 본 사건은 백업 영역 자체)
---
## 엔트리 5. Hero1 facing 반전 + Collider2D 시각 정합 (PM 즉시 처리)
**시각**: 2026-05-07 14:17 ~
**주체**: 총괄PM (직접 처리 — feedback_pm_excessive_decision_request 첫 적용)
**영역**: BT5-Dev Unity 클라이언트 영역
**유형**: PD 지시 → 실측 → PM 즉시 정정 (옵션 나열·결정 요청 없이 진행)
### 배경
> **PD 원문**: "실제 게임에서는 캐릭터 방향을 반전시켜야 해. 물리적인 충돌 판정 영역을 캐릭터 이미지에 맞춰서 조정해줘."
### 실측
| 영역 | 결과 |
|------|------|
| `PlayerController.cs` line 153~159 | 좌우 입력 시 `spriteRenderer.flipX` + `facing` 처리 코드 존재 |
| `AnimationController.cs` line 65~68 | 동일 facing 처리 — **Player.prefab 부착 0건 = dead code** |
| `Animations/*.anim` 8종 `m_FlipX` curve | 0건 (Animator 덮어쓰기 영역 외) |
| `Hero1 idle01` 시각 | 우측 향한 한복 검사 — 갓·검·발 시각 명확 |
| Hero1 PPU | 300 (sprite 430 × 430 → 월드 1.43 × 1.43) |
| 기존 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 반전 동작 확인.
### 산출물
- `E:/EerieVillage/Assets/Scripts/Mechanics/PlayerController.cs` (Edit · 자식 fallback 2 라인)
- `E:/EerieVillage/Assets/Prefabs/Player.prefab` (Edit · BoxCollider2D Size·Offset·TilingProperty)
- `공유/대화로그/EerieVillage/2026-05-07.md` 본 엔트리 추가
- `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` BT5-Dev 7단계 추가
- `.claude/manifest/active/2026-05-07_141743_facing.md`
### feedback_pm_excessive_decision_request 첫 적용
본 작업 = 단순 운영 영역 (Unity 컴포넌트 수치 정정·코드 fallback 추가) + 분석 명확 → **옵션 A/B/C 나열·PD 결정 요청 없이 PM 즉시 처리**. C29·C36·C45·C47 정합.
### 관련 규칙·자산
- C2 근본 해결 (Hero1 영역에 정확히 맞춘 Collider — 이전 잔존 영역 정정)
- C29·C36 (PM 자율 운영 영역)
- C39-10 (실측 후 처리 — AnimationController dead code 확증·anim flipX curve 0건 확증)
- `feedback_pm_excessive_decision_request` (2026-05-07 헌법급 — 첫 적용 사례)
---
## 엔트리 6. Hero1 facing 로직 반전 + Collider Offset 양수 정정 (PD 재보고 후 PM 자인·즉시 재정정)
**시각**: 2026-05-07 14:27 ~
**주체**: 총괄PM
**영역**: BT5-Dev #8 후속 정정
**유형**: PD 재보고 (2건) → PM 시각 판단 실패 자인 + 즉시 재정정
### PD 재보고 원문
> "여전히 캐릭터가 반대방향으로 출력되고 있어. (리소스는 왼쪽을 보고 있지만 게임에서는 오른쪽이 기준이야.) 충돌 영역이 잘못된 것 같아. (캐릭터가 마치 공중에 떠있는 것처럼 스테이지 지면과 떨어져있고, 몬스터를 밟아서 공격할 수 없어)"
### PM 자인 (C5·C44)
엔트리 5에서 본 PM이 Hero1 idle01 시각 확인 시 "우측 향함"으로 판단 → 실제 = **좌측 향함**. C44 팩트 우선 위배. 시각적 판단 실패가 facing 로직·Collider Offset 결정에 직접 영향. 다음 작업부터 Hero1 sprite는 **좌측 default**로 확정.
### 정정 (즉시 처리)
#### 1. flipX 로직 반전 (PlayerController.cs line 153~159)
| 입력 | 기존 | 정정 |
|------|------|------|
| `move.x > 0.01f` (우측 이동) | `flipX = false` | `flipX = true` (sprite 반전 = 우측 향함) |
| `move.x < -0.01f` (좌측 이동) | `flipX = true` | `flipX = false` (sprite default = 좌측 향함) |
`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 일괄 — 별건 추후 정리 영역)
### 산출물
- `E:/EerieVillage/Assets/Scripts/Mechanics/PlayerController.cs` (flipX 로직 반전 2 라인)
- `E:/EerieVillage/Assets/Prefabs/Player.prefab` (m_FlipX 0→1, Collider Size·Offset)
- `공유/대화로그/EerieVillage/2026-05-07.md` 본 엔트리 추가
- `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` BT5-Dev 9단계 추가
- `.claude/manifest/active/2026-05-07_142709_facing2.md`
### 관련 규칙·자산
- C5 정직성·C44 팩트 우선 (본 PM 시각 판단 실패 자인)
- C2 근본 해결 (이전 정정의 잘못된 가정 수정)
- `feedback_pm_excessive_decision_request` (재정정도 즉시 처리)
---
## 엔트리 7. 피격 무적 깜빡임 + 밟기 복원 + 사망 입력 차단 + 부활 팝업 + 부활 무적 (PD 지시 5건 일괄)
**시각**: 2026-05-07 14:33 ~
**주체**: 총괄PM (직접 처리)
**영역**: BT5-Dev #10
**유형**: PD 직접 지시 5건 → PM 즉시 일괄 처리 (옵션 결정 요청 X)
### PD 원문 (5건)
1. 피해 수신 시 0.5초 동안 hit 모션 + 깜빡임 + 무적
2. 몬스터 위에서 밟으면 적 피해 (BT5-Dev 2단계에서 폐기됐던 영역 — 복원)
3. 사망 시 이동 입력 차단
4. 사망 시 부활 팝업 — 예: 제자리 부활 / 아니오: 씬 재시작
5. 부활 직후 2초 무적 (충돌 피해 무시 + 밟기는 가능)
### 처리 (즉시)
| # | 영역 | 변경 |
|---|------|------|
| 1 | `Health.cs` | `invulnerableDuration` 0.6 → 0.5 (PD 1번 정합). hit Trigger 영역은 기존 영역 그대로 |
| 1 | `PlayerInvulnerabilityFlash.cs` (신설) | `IsInvulnerable` 동안 `SpriteRenderer.enabled` 0.1초 간격 toggle |
| 2 | `PlayerEnemyCollision.cs` | 위에서 밟기 판정 (`player.Bounds.center.y >= enemy.Bounds.max.y`) → `Schedule<EnemyDeath>` + `player.Bounce(jumpTakeOffSpeed)`. 측면·아래는 기존 i-frame 피격 |
| 3 | `PlayerController.cs` | `OnHealthDeath``controlEnabled = false` + `move = Vector2.zero`. `OnHealthResurrect``controlEnabled = true` |
| 4 | `ResurrectPromptUI.cs` (신설) | `OnDeathEvent``Time.timeScale=0` + OnGUI 팝업. 예 → `Resurrect()` / 아니오 → `SceneManager.LoadScene(currentScene)` |
| 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 신설 영역 회피). 미관·로컬라이즈는 향후 별건 정리.
### 산출물
- `E:/EerieVillage/Assets/Scripts/Mechanics/Health.cs` (i-frame 0.5 + resurrect 2.0)
- `E:/EerieVillage/Assets/Scripts/Mechanics/PlayerController.cs` (OnDeath/OnResurrect 구독·자동 부착·OnDestroy)
- `E:/EerieVillage/Assets/Scripts/Gameplay/PlayerEnemyCollision.cs` (밟기 복원)
- `E:/EerieVillage/Assets/Scripts/Mechanics/PlayerInvulnerabilityFlash.cs` (신설)
- `E:/EerieVillage/Assets/Scripts/UI/ResurrectPromptUI.cs` (신설)
- `공유/대화로그/EerieVillage/2026-05-07.md` 본 엔트리
- `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` BT5-Dev 11단계 추가
### PD Play 검증 항목 (5건)
1. 피격 → 0.5초 sprite 깜빡임 + i-frame 동안 추가 피격 무시 + hit 모션 1회 재생 (재진입 차단)
2. Enemy 위에서 밟음 → Enemy 사라짐 + Player 점프 효과
3. 사망 후 좌우 이동 입력 차단 (controlEnabled=false)
4. 사망 시 OnGUI 팝업 — 예 → 즉시 부활 / 아니오 → 씬 처음부터
5. 부활 직후 2초 깜빡임 + 측면 적 충돌 시 피해 0 + 적 위 밟기는 정상 발동
### 관련 규칙·자산
- C2 근본 해결 (밟기는 BT5-Dev 2단계 폐기 결정 무효화 — PD 직접 지시 우선)
- C29·C36 (PM 자율 운영 영역 — 5건 일괄 처리)
- `feedback_pm_excessive_decision_request` (옵션 결정 요청 없이 즉시 진행)
---
## 엔트리 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 | `PlayerEnemyCollision.cs` | `player.Bounce(player.jumpTakeOffSpeed / 3f)` (기존 7.0 → 2.33) |
| 3 | `GameOptimizer.cs` (신설) | `Application.targetFrameRate=60` + `QualitySettings.vSyncCount=0` + `Time.fixedDeltaTime=1/60` (RuntimeInitializeOnLoadMethod BeforeSceneLoad). Sprite Atlas·Cinemachine damping·Tilemap CompositeCollider2D는 별건 후속 |
| 4 | `Health.cs` | `GrantInvulnerability(float duration)` 신규 — 외부 시스템이 i-frame 시간 부여 (Mathf.Max로 기존 영역과 비교) |
| 4 | `PlayerController.cs` | `LastGroundedPosition` 신규 + `Update()` 끝에서 `if (IsGrounded) LastGroundedPosition = transform.position` 추적 |
| 4 | `DeathZone.cs` | 즉사 schedule 폐기 → `p.transform.position = LastGroundedPosition` + `velocity = Vector2.zero` + `Health.Decrement(1)` + `GrantInvulnerability(1f)` |
### KinematicObject 영역 활용
- `velocity` = **public Vector2** (외부 접근 가능)
- `IsGrounded` = public 속성
- 외부 변경·접근 영역으로 PlayerEnemyCollision·DeathZone 양쪽 직접 활용
### Sprite Atlas·Cinemachine·Tilemap 영역 (별건 후속 권고)
본 GameOptimizer는 가장 안전한 즉시 적용 영역만. 추가 최적화는 Editor 작업 영역:
- **Sprite Atlas 신설** (Window > 2D > Sprite Atlas Asset) — Hero1 37 sprite 단일 atlas packing → Draw Call 절감
- **Cinemachine Damping** (CinemachineConfiner.prefab) — Look Ahead Smoothing 영역 정정
- **Tilemap CompositeCollider2D** — 다수 BoxCollider2D 통합
### 산출물
- `E:/EerieVillage/Assets/Scripts/Mechanics/Health.cs` (GrantInvulnerability)
- `E:/EerieVillage/Assets/Scripts/Mechanics/PlayerController.cs` (LastGroundedPosition 추적)
- `E:/EerieVillage/Assets/Scripts/Gameplay/PlayerEnemyCollision.cs` (밟기 3조건 + Bounce 1/3)
- `E:/EerieVillage/Assets/Scripts/Mechanics/DeathZone.cs` (즉사 폐기 → HP 감소·복귀·무적)
- `E:/EerieVillage/Assets/Scripts/Mechanics/GameOptimizer.cs` (신설)
- `공유/대화로그/EerieVillage/2026-05-07.md` 본 엔트리
- `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` BT5-Dev 12단계 추가
### PD Play 검증 (4건)
1. 적과 평지 마주침 → 플레이어 피해. 점프 + 적 위 하강 → 적 사망
2. 밟기 시 튕김 = 기존 점프 1/3 영역
3. 화면 스크롤 시 fps 안정 (60 상한)
4. 낙사 → HP -1쿼터 + 마지막 grounded 위치로 복귀 + 1초 깜빡임 무적
### 관련 규칙·자산
- C2 근본 해결 (밟기 단순 위치 판정 → 점프 상태 강화)
- C29·C36 PM 자율 운영
- `feedback_pm_excessive_decision_request` 즉시 진행 정합
---
## 엔트리 9. 밟기 위치 단독 판정·Enemy Trigger 통과·낙사 카메라 외 대기 (PD 지시 3건)
**시각**: 2026-05-07 14:57 ~
**주체**: 총괄PM (직접 처리)
**영역**: BT5-Dev #12
### PD 원문 (3건)
1. 밟기 판정 발생 X — 점프 상태 충돌도 피해
2. 몬스터는 점프 밟기 외에는 통과 가능
3. 낙사 시 캐릭터가 완전히 보이지 않을 때까지 기다린 후 재시작
### 진단·정정
| # | 진단 | 정정 |
|---|------|------|
| 1 | OnCollisionEnter 시점에 KinematicObject가 `velocity.y=0` + `IsGrounded=true` 보정 → `inAir·falling` 조건 false → 밟기 미발동 | **위치 단독 판정**`aboveEnemy = player.Bounds.min.y >= enemy.Bounds.max.y - 0.15f` (tolerance 영역). velocity·IsGrounded 의존 폐기 |
| 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초 무적 |
### 핵심 변경
- `Enemy.prefab` CapsuleCollider2D `m_IsTrigger: 0 → 1`
- `EnemyController.cs` `OnCollisionEnter2D``OnTriggerEnter2D` + `OnTriggerStay2D`
- `PlayerEnemyCollision.cs` 위치 단독 판정 (tolerance 0.15)
- `GameOptimizer.cs` `Physics2D.queriesHitTriggers = false` 추가
- `DeathZone.cs` Coroutine — Camera viewport 외 대기 + 입력 차단
### 안전 영역 (KinematicObject 자기 raycast)
`Physics2D.queriesHitTriggers = false`로 Enemy의 KinematicObject raycast가 자기 Trigger 무시. Tilemap·Player 일반 Collider만 감지 → Enemy 지면 영역 정상.
### PD Play 검증 (3건)
1. 점프 후 적 위 하강 → 적 사라짐 + Player Bounce 1/3
2. 적 옆구리 닿음 (걷기·점프 무관) → 통과 + i-frame 동안만 1쿼터 피해 (Stay 매 프레임이지만 i-frame 차단으로 1회만)
3. 낙사 → 캐릭터가 화면 아래로 사라진 후 (또는 3초 timeout) → 위치 복귀 + 1쿼터 + 1초 깜빡임 무적
### 산출물
- `E:/EerieVillage/Assets/Prefabs/Enemy.prefab` (m_IsTrigger 0→1)
- `E:/EerieVillage/Assets/Scripts/Mechanics/EnemyController.cs` (OnTrigger Enter/Stay)
- `E:/EerieVillage/Assets/Scripts/Gameplay/PlayerEnemyCollision.cs` (위치 단독 판정)
- `E:/EerieVillage/Assets/Scripts/Mechanics/GameOptimizer.cs` (queriesHitTriggers=false)
- `E:/EerieVillage/Assets/Scripts/Mechanics/DeathZone.cs` (Coroutine 영역 대기)
### 관련 규칙·자산
- C2 근본 해결 (velocity·IsGrounded frame 동기화 영역 잘못 → 위치 단독)
- C29·C36 PM 자율 운영
- `feedback_pm_excessive_decision_request` 즉시 진행
---
## 엔트리 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)` 자동 부착. 위에서만 착지·측면·아래 통과 |
### 핵심 변경
- `Enemy.prefab` `m_IsTrigger: 1 → 0`
- `EnemyController.cs` OnTrigger* 폐기 → Awake `IgnoreCollision` + Update `Bounds.Intersects` 직접 감지
- `GameOptimizer.cs` `SetupOneWayPlatforms` 신규 (AfterSceneLoad — Scene 영역 직접 yaml 변경 영역 회피, 런타임 자동 부착)
### One-Way Platform 효과
- 점프 시 천장 통과 → 위에서 다시 내려올 때만 착지
- 측면에서 벽 통과 가능
- 아래에서 위로 통과 가능
- 표준 platformer One-Way 메카닉
### 산출물
- `E:/EerieVillage/Assets/Prefabs/Enemy.prefab` (m_IsTrigger 1→0 복원)
- `E:/EerieVillage/Assets/Scripts/Mechanics/EnemyController.cs` (OnTrigger 폐기·IgnoreCollision·Bounds.Intersects)
- `E:/EerieVillage/Assets/Scripts/Mechanics/GameOptimizer.cs` (SetupOneWayPlatforms)
### PD Play 검증
1. Enemy 시작 시 지면 위 정상 등장 + Patrol Path 정상 이동
2. Player가 Enemy 옆으로 통과 가능 (충돌 X)
3. Player가 Enemy 위에서 하강 시 밟기 발동 (Bounds.Intersects + aboveEnemy 위치 조건)
4. Player 점프 시 천장 통과 (위로 통과 후 다시 내려와 착지)
5. Player 측면 벽 통과 가능
6. 위에서 지면에 닿으면 정상 착지 (One-Way Platform 표준)
### 관련 규칙·자산
- C2 근본 해결 (Trigger 영역 부작용 → IgnoreCollision + Bounds.Intersects)
- C5·C44 자인 (본 PM 직전 변경 부작용)
- `feedback_pm_excessive_decision_request` 즉시 진행
---
## 엔트리 11. VisualBounds 감지 영역 전환 (PM 자인·일관성 영역)
**시각**: 2026-05-07 15:11 ~
**주체**: 총괄PM (직접 처리)
**영역**: BT5-Dev #14
**유형**: PD 강한 어조 보고 (3건) → 본 PM 신중 진단·정정 영역 한정
### PD 원문
> "한번에 제대로 좀 수정해! 일관성 있게 작업하도록 기존에 수정한 내용이 함부로 바뀌지 않도록 신경 써서 작업해!
> - 다시 몬스터와 충돌체크가 발생되지 않고 있어. 몬스터와 닿으면 피해를 입어야 해.
> - 몬스터를 밟으면 몬스터를 처치할 수 있어야 해.
> - 몬스터와 닿았을 때 피해를 입는 것과 별개로 통과해서 이동이 가능해야해."
### PM 자인 (C5·C44)
엔트리 10에서 `_collider.bounds.Intersects` 활용 — Enemy CapsuleCollider2D `m_Size: 0.45 × 0.09`(지면 sensor 영역) 단독으로 감지 → Enemy 본체 영역 부재 → 거의 발동 X. **변경 시점 Collider 크기 미실측**. C39 위배.
### 진단·정정 (영역 한정)
**원인**: Enemy CapsuleCollider2D = ground sensor 전용 (Enemy 발 0.45×0.09). Enemy 시각 영역(SpriteRenderer)과 별개 영역. Bounds.Intersects 충돌 영역 너무 좁음.
**정정 (2개 파일만 변경 — 일관성 영역)**:
| 파일 | 변경 |
|------|-----|
| `EnemyController.cs` | `VisualBounds` 속성 신규 (`spriteRenderer.bounds` fallback `_collider.bounds`). Update 감지 영역 `_collider.bounds.Intersects``VisualBounds.Intersects` |
| `PlayerEnemyCollision.cs` | 밟기 위치 판정 `enemy.Bounds.max.y``enemy.VisualBounds.max.y` (캐릭터 시각 머리 영역 정합) |
### 미변경 영역 (PD 일관성 명시 영역 — 영구 보존)
| 영역 | 상태 |
|------|-----|
| `Physics2D.IgnoreCollision` Player↔Enemy | 그대로 (통과 가능 영역) |
| `Physics2D.queriesHitTriggers = false` | 그대로 |
| `Time.fixedDeltaTime = 1/60` · `targetFrameRate = 60` · `vSync 0` | 그대로 |
| `SetupOneWayPlatforms` (PlatformEffector2D) | 그대로 |
| `DeathZone` Coroutine + 카메라 viewport 영역 외 대기 | 그대로 |
| `Player.prefab` Collider Size·Offset·m_FlipX | 그대로 |
| `PlayerController` flipX 로직·LastGroundedPosition·OnHealthDeath/Resurrect 구독·자동 컴포넌트 부착 | 그대로 |
| `Health` invulnerableDuration 0.5 · resurrectInvulnerableDuration 2.0 · GrantInvulnerability | 그대로 |
| `PlayerInvulnerabilityFlash` · `ResurrectPromptUI` | 그대로 |
| `Enemy.prefab` IsTrigger=0 (지면 충돌 영역) | 그대로 |
| `EnemyController` IgnoreCollision Awake | 그대로 |
### PD Play 검증 (3건)
1. **닿으면 피해**: Enemy 시각 영역에 Player가 닿으면 OnTrigger 영역 X — VisualBounds.Intersects 매 프레임 감지 → PlayerEnemyCollision → i-frame 적용 Decrement
2. **밟기 처치**: 점프 후 적 시각 상단 - 0.15 영역 위 하강 → EnemyDeath + Bounce(jumpTakeOffSpeed/3)
3. **통과 가능**: `Physics2D.IgnoreCollision`로 Player ↔ Enemy 물리 충돌 무시 = 통과 (감지는 별개 Bounds 영역)
### 산출물
- `E:/EerieVillage/Assets/Scripts/Mechanics/EnemyController.cs` (VisualBounds + Update 감지 영역)
- `E:/EerieVillage/Assets/Scripts/Gameplay/PlayerEnemyCollision.cs` (밟기 판정 VisualBounds 기반)
### 관련 규칙·자산
- C2 근본 (Collider 영역 너무 좁음 → 시각 영역 활용)
- C5·C39·C44 (본 PM 미실측 자인)
- `feedback_pm_excessive_decision_request` 옵션 나열 X
- PD 일관성 명시 영역 — 다른 영역 변경 X 의무
---