Commit Graph

216 Commits

Author SHA1 Message Date
깃 관리자 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
깃 관리자 c01f25a558 docs(BT12-Dev Phase 2-C 투사체 6 asset): A01·A02·A03·A08·A14·A15 ActiveSkillData 신규
C49 Phase 2-C — 본 PM 직접 placeholder 수치 작성 (PD a안 채택).

신규 14 파일 (Assets/Resources/Skills/Active/):
- A01_jineonbu.asset (마법 화살·Common·Line·Physical·Ranged·1.5s·dmg 4)
- A02_paieobol.asset (파이어볼·Common·Line·Fire·Ranged|Area·1.5s·dmg 5·DoT 2s)
- A03_bonginmabeop.asset (봉인 마법·Common·Line·Dark·Ranged·1.5s·dmg 3·Stun 1s)
- A08_jeoju_hwasal.asset (저주의 화살·Common·Line·Dark·Ranged·0.8s·dmg 2·DebuffStack 5)
- A14_eolum_chang.asset (얼음 창·Common·Line·Frost·Ranged·1.5s·dmg 5·Slow 2s 50%)
- A15_chujeok_hwayeomgu.asset (추적 화염구·Common·Homing·Fire·Ranged·1.5s·dmg 3·DoT 2s)
- 각 .meta + Skills.meta + Active.meta

m_Script.guid 69566f3f65e99394d8a0ccd0b395ac77 (ActiveSkillData.cs.meta 정합)
모든 .meta GUID unique 32 hex (Python uuid.uuid4 영역 자동 생성)

수치 영역 placeholder (BT11-Plan v0.2 정합·CSV v0.3 영역 영역):
- Common rarity 0
- BaseCooldown 0.8~1.5s (A08만 짧은 주기)
- BaseDamage 2~5 (스킬 위력 영역 카드별 분기)
- 부가 효과 (DoT·Stun·Slow·DebuffStack·Trajectory) 카드별 정합

차후 정정 의무 (balance-designer 영역):
- 60종 영역 정식 수치 (현 6종 placeholder)
- 한자 표기 X (PD 명시·DisplayName 한글만)
- icon sprite 영역 별도 작업

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

C49 — Phase 2-C 본 PM 직접 (단순 반복 카탈로그 v1·yaml 단순)
C50 — ~30K (PD 사전 승인 30~50K 영역 정합)

PD 결정 (a) — 본 PM 권고 수치 직접 placeholder 작성·차후 balance-designer 정식

후속:
- Phase 2-D BT12-MVP-A 통합 정정 (placeholder asset 5장 → 정식 ActiveSkillData 6종 영역)
- Phase 2-E EditMode 테스트
- Phase 2-A·2-B·2-C 영역 PD Play 검증 (Minor 1 후속)
- 다른 카테고리 (B 근접·C 설치·D 소환·E 오라·F 강화) — PD 결정
2026-05-09 19:19:27 +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
깃 관리자 755a51ce89 docs(BT12-MVP-A Phase 2-B asset 5): SkillPlaceholders 5 + meta 5 + folder meta 2 정착
- A01_jineonbu·A05_hagikjin·P01_bonghwanggyeok·P12_saengmyeongkkot·AW01_cheonbugyeongmun
- BT11-Plan v0.2 정합 (P01·P12·AW01 한글명·id 정정 — 설계서 v1 §2-4 오류 정정)
- m_Script.guid f1ff13340310dda49bc653a20d39d921 (SkillCardPlaceholder.cs.meta 정합)
- icon {fileID: 0} placeholder (sprite asset 부재·별도 작업)
- dev-team-lead Phase 1 보고서 §1-2 권고안 정합

C49 표준 - Phase 1 dev-team-lead 설계 → Phase 2 Sonnet 위임 → Phase 3 PM 검증 정합
2026-05-08 19:09:19 +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
깃 관리자 047661cc49 BT12-MVP-A Phase 2-A: 경험치·레벨업 시스템 코드 + JSON 테이블
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 통합
2026-05-08 17:53:39 +09:00
깃 관리자 69b1b9197b BT5-Dev 최적화 B안: Debug.Log 가드 + Legacy 4 파일 정리
PD 직접 지시 2026-05-08 — 프로젝트 반응 속도 최적화. 옵션 B 채택 (#1 Debug.Log + #7 Legacy).

#1 Debug.Log 가드 (#if UNITY_EDITOR && ENEMY_DIAG_VERBOSE) — 7건:
- EnemyController.cs Start[Enemy@N] / MeasureSafeWalk[Enemy@N dir] / Update[BT17·BT20·EnemyDiag]
- GameOptimizer.cs SetupJumpThroughPlatforms[GameOptimizer]
- PlayerEnemyCollision.cs Resolve[PEC]

근본: 16 몬스터 × 60fps frame당 16~32 string boxing + I/O = 반응 속도 저하 주 원인 추정 (Profiler 미실측·C44 추정). Editor 영역 차기 진단 시 ENEMY_DIAG_VERBOSE Scripting Define 추가 시점만 활성.

#7 Legacy 4 파일 정리:
- PlatformDropThrough.cs (자동 Destroy 영역·Layer 8 옛 영역)
- PatrolPath.cs / PatrolPath.Mover.cs (자동 patrol 도입 후 미참조)
- PatrolPathEditor.cs (CustomEditor PatrolPath 의존)
- EnemyController.path / mover field 제거
- PlayerController.Awake PlatformDropThrough Destroy 영역 제거

검증:
- 미참조 grep 0건 (PlatformDropThrough·PatrolPath 전수 제거 정합)
- Scene yaml PatrolPath GameObject 11건 잔존 (Missing Component 상태·게임 영향 X·PD 시각 후속 영역)

산출물: 12 파일 (D 8 + M 4)
2026-05-08 17:24:51 +09:00
깃 관리자 8b54816433 BT5-Dev #111: MeasureSafeWalkDistance 위·아래 1 cell 인접 검색 (좁은 발판 patrol 거리 0 정정)
PD 결정 (i)+(iii) 진행. (iii) 영역 = 이미 정합 (Level + AutoForeground 양 Tilemap 검색). (i) 적용:

근본: 좌·우 same-y cell 즉시 break → 1 cell 폭 발판·계단 영역 patrol 거리 0
정정: nextSame / nextUp / nextDown 중 어느 하나라도 HasTile = 발판 연속

PD 직전 명시 좁은 영역 Enemy 잔여 5건 정정 대상:
- #6 (70.85, -6.46), #10 (17.10, 0.08), #11 (82.28, -5.71 좌측만)
- #15 (60.78, 4.31 좌측만), #16 (24.49, 1.84 사실상 정지)

BT110 다단 fallback (8건→1건 startTm=NULL) + BT111 위·아래 cell 인접 (좁은 영역 patrol 정합 도달)
2026-05-08 17:13:25 +09:00
깃 관리자 19e00d3743 BT5-Dev #110: MeasureSafeWalkDistance 다중 footPos fallback (#2 일부 몬스터 이동 X 정정)
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)
2026-05-08 16:26:36 +09:00
깃 관리자 3dfc466a9e BT5-Dev #109: footPos cell 영역 정정·BT104 Raycast 재배치 폐기
PD 질문 (2026-05-08): "몬스터가 왜 움직지 않는거지?"

진단:
- BT107 footPos.y = bounds.min.y - 0.1f = Enemy 발 영역 cell (cell y=2)
- 그러나 실제 발판 영역 = cell y=1 (발 아래 영역)
- → HasTile(_, 2) X → startTm = null → return 0f
- → patrol 거리 0 → 이동 X

정정 (BT109):
1. footPos.y: bounds.min.y - 0.1 → bounds.min.y - 0.5 (발판 cell 영역 정확)
2. Debug.Log 추가 — dir·footPos.y·startTm·startCell 진단
3. BT104 Raycast 재배치 영역 폐기 (Raycast 영역 부정확·BT107 Tilemap cell 기반 측정으로 일원화)

효과:
- footPos = 발판 cell 영역 (cell y=1) → HasTile 정합 → startTm·startCell 영역 정합
- 측정 정확 → patrolMaxRange/_maxRightRange/_maxLeftRange 정확
- patrol 정상 작동
2026-05-08 15:42:28 +09:00
깃 관리자 5dbde11a48 BT5-Dev #108: 측정 결과 Debug.Log 진단
PD 보고 (2026-05-08): 1) 몬스터 이동 X / 2) 비밀통로 막힘

본 PM 23회+ 가설 누적 부정확 자인.

진단 (BT108):
- Debug.Log 추가 — Start 시점 _startX·_startY·_maxRightRange·_maxLeftRange 출력
- PD Refresh+Play 시각 검증 후 본 PM Editor.log direct read 의무

비밀통로 막힘 진단:
- BT101 영역 PD Foreground TilemapCollider Object.Destroy 영역 정합 검증 (line 80)
- 가능 원인: AutoForeground 영역에 PD 통로 Tile 영역 누적 (이전 Play 영역 결과 Scene yaml 영구) → Drop-Through 패턴 영역
- 또는: 본 PM 자동 분류 영역에서 통로 Tile 영역이 자동 이동됨

본 PM 능력 한계 자인:
- 측정·검출·재배치 영역 23회 가설 누적
- PD 결정 영역 권고:
  - 옵션 1: Debug.Log 결과 보고 후 본 PM 후속 진단
  - 옵션 2: 본 PM 자동 patrol 영역 폐기·PD Editor 영역 직접 PatrolPath 부여
  - 옵션 3: BT47 시점 git checkout 영역 회귀
2026-05-08 15:38:11 +09:00
깃 관리자 1137583b4b BT5-Dev #107: Tilemap cell 기반 측정 (PD 근본 진단)
PD 근본 진단 (2026-05-08): "절벽 체크 로직이 잘못된 것이 근본원인" + 공중 부유 발생

본 PM 22회+ 가설 누적 부정확 자인. PD 근본 진단 정합 — Raycast 영역 자체 부정확.

정정 (BT107):
1. BT106 y 강제 고정 영역 폐기 (공중 부유 원인)
2. MeasureSafeWalkDistance 영역 = Tilemap cell 기반 재설계:
   - GameObject.Find('Level') + 'AutoForeground' → groundTilemaps 영역
   - Enemy 발 아래 cell = 시작 cell (Tilemap.WorldToCell)
   - 좌·우 연속 Tile 영역 끝 영역 검색 (cell + Vector3Int.left/right)
   - HasTileInAnyTilemap 검사 (Level + AutoForeground)
   - 마지막 Tile cell center 영역까지 거리 - 0.5m margin

효과:
- Raycast 영역 부정확 영역 폐기 (Tile data 직접 사용)
- Tile cell 단위 정확 영역 측정 → patrol 영역 정확
- 시작 cell 발판 X 시 = 0 반환 (재배치 영역 BT104에서 처리)
- 공중 부유 영역 차단 (BT106 폐기)
2026-05-08 15:34:53 +09:00
깃 관리자 589f6ad258 BT5-Dev #106: y 영역 영구 고정 (떨어짐 영구 차단)
PD 명시 (2026-05-08): "여전히 떨어졌다 복귀하는 모습 잔존·수정할 수 없어?"

본 PM 측정·검출 영역 22회 가설 누적 부정확. 근본 해결:

정정 (BT106):
- UpdatePatrol 시작 영역에 y 영역 강제 고정:
  - |transform.y - _startY| > 0.1f 시 = 즉시 _startY 복귀
  - transform.position + body.position 동시 set
  - control.velocity.y = 0 강제 (gravity 영향 차단)

효과:
- Enemy 영역 매 frame _startY 영역에 영구 고정 → 떨어짐 영역 0.1m 이상 발생 X
- BT102 텔레포트 영역 = 보조 fallback (트리거 X 가설)
- patrol 영역 = X 영역만 이동 (Y 고정)
- 시각상 = 자연 patrol (Y 변화 X·발판 외 영역 도달 X)

부수 효과:
- Enemy 영역 = 발판 위 영역 영구 (gravity X)
- 다른 높이 발판 patrol 영역 X (시작 위치 Y 영역만)
2026-05-08 15:29:22 +09:00
깃 관리자 70d5bc42d2 BT5-Dev #105: 제자리 사망·안전 margin 2.0m (PD 2건)
PD 보고 (2026-05-08):
1. 밟기 처치 Enemy 맵에서 떨어짐 → 제자리 사망 모션
2. 떨어짐 잔존 → 낭떠러지 닿기 전 방향 전환

정정 (BT105):
1. EnemyDeath.cs:
   - body.simulated = false 추가 (Rigidbody2D 물리 미참여 → gravity X)
   - = 제자리 사망 (death 애니메이션 + 1초 Destroy)
2. EnemyController.cs MeasureSafeWalkDistance:
   - 안전 margin 0.5m → 2.0m
   - patrol _maxRightRange/_maxLeftRange = 측정 거리 - 2.0m
   - = patrol 영역이 절벽에서 항상 2m 이상 영역 → 절벽 도달 X

효과:
- 밟기 사망 = 제자리 사망 (떨어짐 X·시각 자연 모션)
- patrol 영역 = 절벽에서 2m 안전 영역까지 → 절벽 영역 도달 X
2026-05-08 15:27:12 +09:00
깃 관리자 517e9c51fc BT5-Dev #104: EnemyDeath 강화·시작 위치 발판 검증·자동 재배치 (PD 2건)
PD 보고 (2026-05-08):
1. 떨어졌다 복귀 반복 (시작 위치 발판 X 영역 가설)
2. 밟아서 처치한 Enemy 죽지 X·잔존

정정 (BT104):

1. EnemyDeath.cs:
   - enemy._collider.enabled = false (기존)
   - enemy.control.enabled = false (기존)
   - **enemy.enabled = false** 추가 (EnemyController patrol 영역 정지)
   - **animator.SetTrigger('death')** 추가 (death 애니메이션)
   - **Object.Destroy(enemy.gameObject, 1f)** 추가 (1초 후 영역 제거)

2. EnemyController.Start (재배치):
   - 시작 위치 발 영역 Raycast → groundUnder X 시 = 발판 X
   - 좌·우 0.5m 간격 50m 영역 검색 → 가까운 발판 영역 발견 시 = transform + _startX 재배치
   - _startY = 재배치 후 갱신

효과:
- 밟기 처치 = enabled=false + death 애니메이션 + 1초 후 Destroy → 정상 사망
- Enemy 시작 위치 발판 X 시 = 가까운 발판 자동 재배치 → 떨어짐 X
- BT102 텔레포트 영역 = 보조 영역 (재배치 후 트리거 X)
2026-05-08 15:24:25 +09:00
깃 관리자 64d30a165e BT5-Dev #103: 정확 측정 (Start 시점·0.1m 간격·Capsule 정확)
PD 명시 (2026-05-08): "미리 생성하는 시점에 맵 탐색·자신이 탐색 가능한 범위 결정"

진단:
- BT94/BT97 영역 측정 영역 0.5m 간격 + groundY = transform.y - 0.34f 추정
- 0.5m 미만 영역 절벽 검출 X 가능
- groundY 추정 영역 Capsule offset 영역과 정합 X 가능

정정 (BT103):
- groundY = _collider.bounds.min.y + 0.05f (Capsule 발 영역 정확)
- 간격: 0.5m → 0.1m (촘촘 측정)
- 안전 margin: 1.5m → 0.5m (실제 절벽 영역까지 정확)
- Start 시점 1회 측정 (BT97 영역 그대로·AfterSceneLoad 후·AutoForeground Tile 활성)

효과:
- Capsule 발 영역 정확 기준 측정 → 정확한 절벽 거리
- 0.1m 간격 = 0.5m 미만 절벽도 검출
- 0.5m margin = 절벽 영역에서 0.5m 안전 영역까지 patrol → 실제 절벽 영역 도달 X
- BT102 텔레포트 영역 = 측정 영역 정확 시 X 트리거 → 시각상 자연 patrol
- 1회 측정 (Start) = 최적화 (매 frame 측정 X)
2026-05-08 15:20:03 +09:00
깃 관리자 725c7105e3 BT5-Dev #102: 투명벽 폐기·y 검출 텔레포트 (PD 명시 채택)
PD 명시 (2026-05-08): "몬스터의 투명벽을 삭제하고 몬스터가 낭떠러지로 떨어지지 않도록 할 방법을 찾아봐"

변경:
1. GameOptimizer.cs:
   - Init() Physics2D.IgnoreLayerCollision(13, 18) 영역 폐기
   - SetupCliffWalls·CreateCliffWall·HasTileInAny 영역 폐기 (BT99/BT100/BT101 영역 제거)
   - SetupJumpThroughPlatforms 끝에 기존 CliffWalls GameObject Object.Destroy (정리)
2. EnemyController.cs:
   - _startY 영역 신규 (Awake 시점 transform.position.y)
   - fallThreshold Inspector 영역 신규 (기본 1.0m)
   - BT98 R1 영역 (발 자체 Raycast) 폐기 → BT102 y 검출 영역으로 대체
   - 매 frame Update: transform.position.y < _startY - fallThreshold 시:
     - 시작 위치 (startX, startY) 텔레포트 (transform + body 동시)
     - velocity = Vector2.zero
     - patrolPhase 0·SetNextPatrolTarget·cooldown·waitTimer·stuckTimer 영역 초기화

효과:
- 투명벽 영역 (Layer 18·CliffWalls GameObject) 완전 폐기
- Enemy 영역 떨어진 후 = 즉시 시작 위치 복귀 (영구 떨어짐 X)
- 단순·근본 방법 (algorithm 영역 부정합 잔존 시도 안전 보장)
- 시작 위치 = 안전 영역 가설 (PD가 Enemy 영역 발판 위 배치)
2026-05-08 15:16:10 +09:00
깃 관리자 0aead1ea49 BT5-Dev #101: PD Foreground TilemapCollider 제거·인접 검사 PD FG X (PD 2건)
PD 보고 (2026-05-08):
1. 숨겨진 통로 Player 통과 X (이전엔 문제 X)
2. 투명벽 위치 이상

진단:
- 1: BT82 영역 PD Foreground TilemapCollider 부착 = 통로 영역 충돌
- 2: BT100 인접 검사 = PD Foreground 포함 → PD FG 영역 옆 = cliff X 인식 → 실제 절벽 영역 투명벽 X 생성

정정 (BT101):
1. PD Foreground TilemapCollider Object.Destroy (BT66 R2 영역 회복·BT82 부착 영역 폐기)
   - Enemy 절벽 차단 = BT99 투명벽 영역 (Layer 18)으로 분리됨 → PD Foreground = 시각만 영역 회복 가능
   - 숨겨진 통로 영역 Player 자유 통과
2. 인접 검사 = Level + AutoForeground 만 (PD Foreground 영역 X)
   - PD FG = TilemapCollider X = Enemy 발판 X = 검사 영역 X
   - 실제 절벽 영역 정확 검출 → 투명벽 정확 위치

효과:
- 숨겨진 통로 = Player 자유 통과 (BT66 R2 영역 회복)
- 투명벽 = Level/AutoForeground 영역 가장자리만 검출·정확 위치
- Enemy 절벽 차단 = 투명벽 (Layer 18)
2026-05-08 15:12:03 +09:00
깃 관리자 ad7cb55bf6 BT5-Dev #100: 투명벽 size 정정·PD Foreground 자체 검사 X·waitTimer 정합 (PD 3건)
PD 보고 (2026-05-08):
1. 투명벽 위치 너무 짧게 멈춤 (절벽 위치보다 안쪽)
2. 대기 시간 짧음 (1~3초 대기 X)
3. 숨겨진 통로 막힘

진단:
- 1: BoxCollider size (0.1, 3) → halfWidth 0.05m → Enemy Capsule bounds 정합 시 절벽 영역 0.282m 앞 멈춤
- 3: PD Foreground 자체 가장자리 영역 = 시각 가림막 영역 끝 = 통로 영역. 본 PM 가장자리 검사 영역에 PD Foreground 포함 → 통로 영역에 투명벽 생성 → Player 통과 X (Layer 13 ↔ 18 OFF임에도 BoxCollider 영역 정합 X 가능성)

정정 (BT100):
1. BoxCollider size: (0.1, 3) → (0.02, 3) (매우 좁음)
2. BoxCollider offset.y: 1 → 0 (Tile 표면 영역·절벽 위치 정확)
3. 자체 가장자리 검사 = Level + AutoForeground 만 (PD Foreground 자체 검사 X)
4. 인접 검사 = Level + AutoForeground + PD Foreground 모두 (안전 영역 모두 포함)

효과:
- 투명벽 = 매우 좁은 영역 + Tile 표면 영역 → Enemy 영역 절벽 영역 가까이 도달
- PD Foreground 자체 가장자리 영역 = 검사 X → 숨겨진 통로 영역 투명벽 X → Player·Enemy 통과 가능
- waitTimer 영역 그대로 (1~3초 random·arrive 시점 트리거)
2026-05-08 15:01:12 +09:00
깃 관리자 63cecf04ec BT5-Dev #99: EnemyWall Layer 18·투명벽 자동 생성 (PD 명시 채택)
PD 명시 (2026-05-08): "낭떠러지 앞에 몬스터만 지나갈 수 없는 투명한 벽을 세우면 안돼?"

본 PM 17회 가설 누적 부정확 자인 후 PD 직접 단순 해결 채택.

변경:
1. ProjectSettings/TagManager.asset:
   - Layer 18 = 'EnemyWall' 신규 추가
2. GameOptimizer.cs Init():
   - Physics2D.IgnoreLayerCollision(13, 18, true) — Player ↔ EnemyWall 충돌 OFF (Player 통과)
3. GameOptimizer.cs SetupCliffWalls() 신규:
   - 모든 Tilemap (Level·AutoForeground·PD Foreground) Tile 영역 순회
   - Tile 좌·우 인접 영역이 모든 Tilemap에 Tile X 시 = 절벽 가장자리
   - 가장자리 위치에 BoxCollider2D GameObject (CliffWall) 자동 생성
   - Layer 18 (EnemyWall) + size (0.1×3) + offset (0, 1)
   - parent = CliffWalls GameObject (그룹 영역)

효과:
- Player ↔ EnemyWall 충돌 OFF → Player 자유 통과
- Enemy ↔ EnemyWall 충돌 ON → Enemy 절벽 가장자리 도달 시 차단
- 알고리즘 부정합 무관 (물리 영역 차단)
- BT98 R1 방어 영역 = 보조 (투명벽 차단으로 X 도달 가설)
2026-05-08 14:55:16 +09:00
깃 관리자 b3cbbdbf40 BT5-Dev #98: R1 방어 영역 — 발 자체 검사·시작 위치 텔레포트 복귀
PD 강한 어조 (2026-05-08): "여전히 몬스터가 낭떠러지로 떨어져"

본 PM 17회 가설 누적 부정확 자인. R1 방어 영역 즉시 적용:

매 frame Update 영역 마지막에 발 영역 자체 절벽 검사:
- footHere = (_collider.bounds.center.x, _collider.bounds.min.y + 0.05f)
- Raycast Layer 0+16 cliffCheckDepth 영역
- groundUnder.collider == null 시 = 발 영역 자체 절벽
- 시작 위치 텔레포트 즉시 복귀:
  - transform.position + body.position 동시 set
  - control.velocity = Vector2.zero (낙하 차단)
  - patrolPhase = 0, SetNextPatrolTarget, cooldown 활성, waitTimer 1~3초

효과:
- 본 PM 알고리즘 영역 부정합 잔존 시도 = 떨어짐 검출 즉시 시작 위치 복귀
- 영구 떨어짐 X 보장 (방어 영역)
- 시작 위치 = 안전 영역 가설 (PD가 Enemy 영역 발판 위 배치)

후속 의무:
- PD Refresh+Play 시각 검증 (떨어짐 차단 정합)
2026-05-08 14:13:23 +09:00
깃 관리자 e701829356 BT5-Dev #97: Start 시점 안전 거리 측정 (AutoForeground Tile 활성 후)
PD 보고 (2026-05-08): 벽 영역 자연스러움 ·낭떠러지 떨어짐 잔존

진단:
- BT94 MeasureSafeWalkDistance = Awake 시점 호출
- AutoForeground Tile data = RuntimeInitializeOnLoadMethod(AfterSceneLoad) 시점 활성
- Unity execution order: Awake → AfterSceneLoad → Start
- = Awake 시점 = AutoForeground Tile 영역 미처리 → MeasureSafeWalkDistance 영역 = AutoForeground 발판 검출 X
- = 안전 거리 영역 부정확 (실제 절벽 영역과 다름) → patrol 영역 절벽 도달 → 떨어짐

정정 (BT97):
1. _isInitialized 영역 신규 (Awake = false / Start = true)
2. Awake 시점 = _startX·_lastX·patrolPhase 영역만 초기화 (측정·target X)
3. Start 시점 (AfterSceneLoad 이후) MeasureSafeWalkDistance 호출 + SetNextPatrolTarget + _isInitialized=true
4. UpdatePatrol 영역 시작에서 !_isInitialized 시 control.move.x = 0 + return (patrol 비활성)

효과:
- AutoForeground Tile 영역 활성 후 안전 거리 측정 → 정확한 절벽 거리
- patrol 영역 = 안전 거리 cap 정확 → 절벽 영역 도달 X
- 측정 전 1 frame patrol 비활성 = 안전
2026-05-08 14:00:46 +09:00
깃 관리자 53e6a5935f BT5-Dev #96: transform+body 동시 push (가장자리 밀림 차단)
PD 보고 (2026-05-08): "몬스터가 벽 가장자리에 닿으면 밀려나는 현상·방향 튼 상태로 뒤로 밀려남"

진단:
- BT95 velocity.x = -moveDir * maxSpeed = 1 frame만 적용 (KinematicObject FixedUpdate 영역에서 velocity.x = targetVelocity.x로 덮어씀)
- transform.position 영역 ↔ body.position 영역 비동기 = KinematicObject 영역 부정합 → 미세 영역 잔존

정정 (BT96):
1. _body Rigidbody2D 영역 캐싱 (Awake)
2. TriggerReverse(moveDir, pushDistance) 함수 신규:
   - phase+2 + SetNextPatrolTarget
   - transform.position + body.position 동시 push (반대 방향 0.2~0.3m)
   - velocity.x = -moveDir * maxSpeed + move.x = -moveDir
   - cooldown 1.0초 활성
3. 절벽 검출 시 TriggerReverse(moveDir, 0.3f)
4. 벽 정지 (stuckTimer) 시 TriggerReverse(moveDir, 0.2f)

효과:
- transform + body 동시 set = KinematicObject body 영역 정합 = 비동기 영역 부정합 차단
- 즉시 반대 방향 0.2~0.3m push = 가장자리 영역에서 즉시 멀어짐
- velocity.x 큰 속도 = 다음 frame 안정 이동
- 1초 cooldown = 충분 영역 멀어진 후 재검출
2026-05-08 13:55:08 +09:00
깃 관리자 32012aa450 BT5-Dev #95: PatrolPath path 영역 제거·velocity 즉시 반대 방향 (PD 명시)
PD 명시 (2026-05-08):
1. 가장자리 좌우 반복 잔존
2. 모든 Enemy의 PatrolPath 제거 + 자동 알고리즘만

정정 (BT95):
1. Scene Ingame.unity Enemy 인스턴스 path 영역 m_Modifications 12건 제거
   - Python 자동 영역 (PrefabInstance 영역에서 propertyPath: path 영역 삭제)
   - PatrolPath GameObject 영역은 Scene 잔존 (영향 X·EnemyController 영역 미참조)
2. EnemyController.cs:
   - PHASE_COOLDOWN 0.5 → 1.0 (긴 영역·좌우 반복 영구 차단)
   - 절벽·벽 검출 시 velocity.x = 0 → velocity.x = -moveDir * maxSpeed (즉시 반대 방향 큰 속도)
   - control.move.x = -moveDir 직접 (1 frame 지연 차단)

효과:
- velocity 영역 즉시 반대 방향 큰 속도 → 가장자리에서 빠르게 멀어짐
- 1초 cooldown = 충분 영역 멀어진 후 검출 활성 → 좌우 반복 X
- PatrolPath path 영역 m_Modifications 제거 = 자동 patrol 영역만 사용 (PD 명시)
2026-05-08 13:50:32 +09:00
깃 관리자 e453d1d07e BT5-Dev #94: phase cooldown 0.5초·시작 시 안전 거리 측정 (좌우 반복·좁은 영역 차단)
PD 보고 (2026-05-08): 1) 벽 가장자리 좌우 반복 / 2) 좁은 영역 생성 Enemy 떨어짐

진단:
- 좌우 반복: phase 전환 직후 1~2 frame 미세 정지 → stuckTimer 트리거 → 또 phase+2 → 매 frame 반복
- 좁은 영역: patrol 거리 50~75m > 시작 위치 ↔ 절벽 거리 → 시작 즉시 절벽 영역 도달 → 떨어짐

정정 (BT94):
1. _phaseCooldown 영역 신규 (0.5초)
   - phase 전환 직후 절벽·벽 검출 비활성
   - cooldown 동안 Enemy 영역 반대 방향 이동 (충분 영역) → 안정
2. 시작 시 좌·우 walk 영역 안전 거리 측정 (MeasureSafeWalkDistance)
   - Awake 시점 0.5m 간격 Raycast 영역 절벽 검출까지 거리 측정
   - patrol 거리 = min(설정 거리, 측정 거리 - 1.5m 안전 margin)
   - _maxRightRange·_maxLeftRange 영역
3. SetNextPatrolTarget — _maxRightRange/_maxLeftRange cap 적용

효과:
- 좌우 반복 = phase cooldown 0.5초 = phase 전환 직후 검출 X → 안정
- 좁은 영역 = 시작 시 안전 거리 측정 → patrol 영역 절벽 영역 도달 X
- 일반 영역 = 영향 X (안전 거리 측정 ≥ patrolMaxRange)
2026-05-08 13:41:18 +09:00
깃 관리자 585eca1022 BT5-Dev #93: transform push 폐기·velocity.x 0 강제 (KinematicObject 정합)
PD 보고 (2026-05-08): 가장자리 밀림·갑자기 바닥 떨어짐·낭떠러지 돌진

진단:
- BT92 transform.position += 직접 set = KinematicObject body.position 영역과 충돌
- = body.position ↔ transform.position 비동기 → 비정상 위치 → 갑자기 떨어짐
- BT92 stuckThresholdTime 0.3 = 가장자리 밀림 누적 영역 발생

정정 (BT93):
1. transform.position push 폐기 (cliffSafePushDistance Inspector 영역도 폐기)
2. 절벽·벽 검출 시 control.velocity = (0, velocity.y) 강제
   - velocity.x 영역 즉시 0 = 관성 차단 = 발 절벽 진입 X
   - velocity.y 보존 (gravity·점프 영역)
3. stuckThresholdTime: 0.3 → 0.15 (150ms·밀림 누적 차단)

효과:
- KinematicObject body 영역 정합 (transform 직접 set X)
- 절벽 영역 = velocity.x 즉시 0 + 반대 방향 control.move.x → 다음 frame 반대 이동
- 벽 가장자리 = 150ms 정지 후 phase+2 + velocity.x 0
- 이상 떨어짐 영역 차단
2026-05-08 13:28:32 +09:00
깃 관리자 7b484757e9 BT5-Dev #92: stuckTimer 0.3·cliff 1.0·transform safe push (좌우 반복·낭떠러지 차단)
PD 보고 (2026-05-08): 1) 벽 가장자리 좌우 반복 / 2) 낭떠러지 돌진 떨어짐

진단:
- 좌우 반복: stuckTimer 50ms 영역이 phase 전환 직후 1 frame 정지를 정지로 인식 → 매번 트리거 → 부들부들
- 낭떠러지: cliffCheckDistance 0.8m + 1 frame 지연으로 발 영역 절벽 진입 → KinematicObject 영역 발 아래 충돌 X → gravity 떨어짐

정정 (BT92):
1. stuckThresholdTime: 0.05 → 0.3 (300ms — phase 전환 직후 미세 정지 영역 무시)
2. cliffCheckDistance: 0.8 → 1.0 (1m 일찍 검출)
3. cliffSafePushDistance Inspector 영역 신규 (기본 0.15m)
4. 절벽 검출 시: transform.position += (-moveDir * 0.15m) 즉시 안전 영역 push
   - 1 frame 지연 영역에서 발 영역 절벽 진입 차단
   - 이후 phase+2 + control.move.x = 반대 방향

효과:
- 벽 가장자리 = stuckTimer 300ms 임계값 → phase 전환 후 안정 → 좌우 반복 X
- 절벽 영역 = 1m 앞 검출 + transform 즉시 안전 push → 발 영역 절벽 X → 떨어짐 X
- arrive·일반 patrol 영역 그대로
2026-05-08 12:52:08 +09:00
깃 관리자 c7943b177e BT5-Dev #91: 절벽·벽 즉시 반대 이동·waitTimer arrive만 (자연스러운 patrol)
PD 보고 (2026-05-08): 1) 낭떠러지 떨어짐 잔존 / 2) 부들부들 / 3) 자연스러운 patrol

진단:
- BT86 cliffCheckDistance 0.3 = 발 외부 0.017m → 너무 가까움
- 절벽 영역 도달 직전 검출 → 다음 frame 발 영역 절벽 진입 + waitTimer 1~3초 정지 → gravity로 떨어짐
- 벽 영역 = stuckTimer 50ms → phase+2 + waitTimer 정지 → 부들부들

정정 (BT91):
1. cliffCheckDistance: 0.3 → 0.8 (더 일찍 검출·발 외부 0.5m)
2. cliffCheckDepth: 1.5 → 2.0 (더 깊게)
3. 절벽 검출 시: phase+2 + 즉시 반대 방향 이동 (waitTimer X)
   - control.move.x = Mathf.Clamp(dx_new, -1, 1) 즉시 적용
4. 벽 정지 (stuckTimer 50ms) 시: phase+2 + 즉시 반대 방향 이동 (waitTimer X)
5. patrol arrive 시점만 waitTimer 1~3초 대기 (안전 영역만 정지)

효과:
- 절벽 영역 = 더 일찍 검출 + 즉시 반대 이동 (정지 X·떨어짐 X)
- 벽 영역 = 즉시 반대 이동 (부들부들 X)
- arrive 시점만 자연스러운 1~3초 대기
- patrol 사이클: 이동 → arrive → 1~3초 idle → 이동 → arrive → idle (자연스러움)
- 위험 영역 (벽·절벽) = 즉시 반응 (정지 X)
2026-05-08 12:46:09 +09:00
깃 관리자 ec05dc0582 BT5-Dev #90: 수평 Raycast 폐기·stuckTimer 50ms (거짓 양성 차단)
PD 보고 (2026-05-08): "몬스터들이 전혀 이동하지 않고 있어"

진단:
- BT89 수평 Raycast = bounds 외부 0.05+0.1m = 같은 Tile cell (1m) 영역 검출 → 거짓 양성
- 매 frame phase+2 + waitTimer 1~3초 → 영구 대기 사이클 → 정지

정정 (BT90):
- 수평 벽 Raycast 영역 폐기 (BT85 영역 회복)
- wallCheckDistance Inspector 영역 폐기
- stuckThresholdTime 0.1 → 0.05 (50ms·거의 즉시)
- stuckTimer 영역 = 벽 정지 50ms 후 phase+2 + waitTimer 1~3초
- 절벽 검출·waitTimer 영역 그대로

효과:
- 정상 이동 시 stuckTimer 누적 X (frame당 ~0.058m > 0.02m 임계값)
- 벽 정지 시 50ms 후 phase+2 (거의 즉시)
- 절벽 영역 = 즉시 phase+2 + 대기
- arrive·벽·절벽 = 1~3초 대기 후 다음 phase
2026-05-08 12:43:11 +09:00
깃 관리자 a5b87534e7 BT5-Dev #89: Enemy 즉시 벽 검출 + 1~3초 대기 영역 (PD 2건)
PD 보고 (2026-05-08):
1. 벽 영역 버벅대다 밀림 → 즉시 반대 방향 의무
2. patrol 1회 후 1~3초 대기 패턴

정정 (BT89):
1. UpdatePatrol() 영역 분리 — patrol·벽·절벽·대기 통합
2. 수평 벽 Raycast 부활:
   - bounds 외부 (halfWidth + 0.05m) 시작
   - distance 0.1m (총 0.15m·인접 Tile X)
   - 검출 시 phase+2 즉시 전환 (stuckTimer 100ms 영역 폐기 — 즉시)
3. 절벽 검출:
   - 검출 시 phase+2 즉시 전환
4. _waitTimer 영역 신규:
   - patrol arrive 시 Random.Range(1, 3)초 대기
   - 벽 검출 시 동일 (대기 후 반대 방향 patrol)
   - 절벽 검출 시 동일
   - 대기 중 control.move.x = 0
5. stuckTimer 보조 영역 잔존 (수평 Raycast 미감지 fallback)
6. Inspector 노출: wallCheckDistance·waitMinTime·waitMaxTime

효과:
- 벽 영역 = 즉시 반대 방향 (Raycast 검출 frame에 phase+2)
- 절벽 영역 = 즉시 반대 방향
- patrol arrive·벽·절벽 = 1~3초 random 대기 후 다음 phase
- 대기 중 = control.move.x = 0 (Idle)
- 시각상 자연스러운 patrol 패턴
2026-05-08 12:39:25 +09:00
깃 관리자 eeb7ded8ee BT5-Dev #88: Enemy 절벽·벽 검출 phase+2 (시작 위치 복귀 폐기·즉시 반대 방향)
PD 보고 (2026-05-08): "이번에는 몬스터들이 다시 낭떠러지로 떨어져버렸어 (이전 버전은 떨어지지 않음)"

진단:
- BT86 절벽 검출 = phase+1 (= 시작 위치 복귀)
- BT87 patrol 거리 절반 (50~75) → 시작 위치 ↔ 절벽 거리 작아짐
- 시작 위치 복귀 도중 = 절벽 영역 도달 → 떨어짐

정정 (BT88):
- 절벽 검출 시: phase+2 (반대 방향 patrol·시작 위치 복귀 폐기)
- 벽 정지(stuckTimer) 시: phase+2 (동일·즉시 반대 방향)

phase 전환 영역:
- phase 0 (우측 out) → phase 2 (좌측 out)
- phase 1 (시작 복귀·우측에서) → phase 3 (시작 복귀·좌측에서)
- phase 2 (좌측 out) → phase 0 (우측 out)
- phase 3 (시작 복귀·좌측에서) → phase 1 (시작 복귀·우측에서)

효과:
- 절벽 영역 = 즉시 반대 방향 patrol (시작 위치 영역 X)
- 벽 충돌 = 동일 (즉시 반대 방향)
- 시작 위치 절벽 근처 영역 = 안전
2026-05-08 12:34:43 +09:00
깃 관리자 050b00eaee BT5-Dev #87: Enemy 벽 충돌 즉시 전환·순찰 거리 절반 (PD 2건)
PD 보고 (2026-05-08):
1. 벽 충돌 후 움찔거리다 방향 전환 어색
2. 순찰 거리 너무 멀어 절반으로

정정 (BT87):
1. stuckThresholdTime: 0.3 → 0.1 (100ms·움찔 차단·즉시 방향 전환)
2. patrolMinRange: 100 → 50 / patrolMaxRange: 150 → 75 (절반)

효과:
- 벽 충돌 시 100ms 정지 → 즉시 다음 phase (반대 방향 patrol)
- 순찰 거리 = 시작 위치 기준 좌/우 random 50~75 왕복
2026-05-08 12:27:54 +09:00
깃 관리자 8baa3a6f80 BT5-Dev #86: Enemy 속도 2배 느림·미세 밀림 검출·절벽 즉시 phase 전환 (PD 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 = 절벽 영역 검출 → 즉시 반대 방향
2026-05-08 12:16:38 +09:00
깃 관리자 007b4dd61a BT5-Dev #85: Enemy y+0.3·수평 Raycast 폐기 (PD 2건)
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 시각 검증
2026-05-08 11:52:05 +09:00
깃 관리자 aad1b4e0ed BT5-Dev #84: 수평 Raycast 시작 영역 외부 정정 (BT83 거짓 양성 차단)
PD 보고 (2026-05-08): "이제는 모든 몬스터가 이동(순찰 패턴)하지 않고 있어"

근본 원인:
- BT83 wallOrigin = bounds.center.x + moveDir * 0.05 = Capsule bounds 내부
- Enemy가 Foreground Tile 위 영역에 서있을 때 = 인접 Tile (같은 Layer 16) Raycast 검출
- = 거짓 양성 → 즉시 다음 phase 강제 → 매 frame 반복 → patrol X

정정 (BT84):
- wallOrigin.x = bounds.center.x + moveDir * (halfWidth + 0.05f)
- = Capsule bounds 외부 영역 시작 → 자기 영역(또는 같은 Tile) 검출 X
- 절벽 검출 영역 그대로 (footAhead 영역은 발 앞 cliffCheckDistance·다른 영역)

효과:
- Enemy 영역 자기 검출 X = 거짓 양성 차단
- 벽 영역 정상 검출 (외부 영역만)
- patrol 정상 작동

후속 의무:
- PD Refresh+Play 시각 검증
2026-05-08 11:47:17 +09:00
깃 관리자 4603fdf947 BT5-Dev #83: Enemy 수평 벽 검출 추가 (벽 가장자리 미세 밀림 차단)
PD 보고 (2026-05-08): "몬스터가 벽 가장자리에서 이동하지 못하게 되면 밀려나면서 결국 낭떠러지로 떨어지고 있어"

진단:
- 벽 가장자리 정지 시 미세 밀림(< 0.01 영역) → stuckTimer 누적 X
- 다음 phase 전환 X → 미세 밀림 누적 → 결국 절벽 영역 도달 → 떨어짐
- BT81 stuckTimer 영역만으로 부족 (정지 임계값 0.01 미달 미세 밀림 미감지)

정정 (BT83):
1. wallCheckDistance 영역 신규 (Inspector 노출·기본 0.5)
2. 수평 벽 Raycast 검출 추가:
   - 발 영역 horizontal (moveDir 방향) Raycast Layer 0+16
   - 벽 검출 시 즉시 다음 phase 강제 (stuckTimer 영역과 분리)
3. stuckThresholdTime: 0.5 → 0.3 (빠른 영역 전환)

효과:
- 벽 영역 즉시 검출 + 다음 phase = 정지·밀림 영역 도달 X
- 절벽 영역 도달 X = 떨어짐 차단
- stuckTimer 영역 = 보조 (벽 검출 + 미감지 fallback)

후속 의무:
- PD Refresh+Play 시각 검증
2026-05-08 11:43:38 +09:00
깃 관리자 4d83bbc028 BT5-Dev #82: PD Foreground TilemapCollider 부착 회복 (Enemy 떨어짐 정정)
PD 보고 (2026-05-08): "여전히 몬스터가 낭떠러지로 사라졌어"

근본 원인:
- BT66 R2 영역에서 PD Foreground TilemapCollider2D Object.Destroy
- = PD 직접 그린 발판 영역 위에 Enemy 배치 시 발 아래 충돌 X = 떨어짐
- BT81 절벽 검출 영역 = footAhead Raycast Layer 0+16. PD Foreground = TilemapCollider X = Raycast 검출 X = 절벽 영역 인식 X = 떨어짐

정정 (BT82):
- BT66 R2 영역의 PD Foreground TilemapCollider2D Destroy 영역 폐기
- TilemapCollider2D 부착 회복 + Layer 16 강제 (AutoForeground와 동일)

효과:
- Player ↔ PD Foreground = Drop-Through 패턴 영역 정상 (통과·착지 분기)
- Enemy ↔ PD Foreground = 충돌 ON (Layer 14 ↔ Layer 16) = 떨어짐 X
- Enemy 절벽 검출 = PD Foreground·AutoForeground 모두 Layer 16 + TilemapCollider = 정합

후속 의무:
- PD Refresh+Play 시각 검증 (Enemy 떨어짐 X·Player 통과 영역 그대로)
2026-05-08 11:37:45 +09:00
깃 관리자 cbde93a66d BT5-Dev #81: Enemy 벽 정지·낭떠러지 정정 (PD 2건)
PD 보고 (2026-05-08):
1. 벽에 닿은 후 멈춰있음 (이동 거리 미달 + 벽 충돌 → dx 영역 큰 값 잔존 → 영구 정지)
2. 낭떠러지 떨어짐 (절벽 검출 거짓 양성 또는 미검출)

진단:
- 버그 1: BT80 코드는 dx<arriveThreshold 시점만 다음 phase. 벽 충돌 시 KinematicObject body.Cast 차단 → transform.x 정지 → dx 영역 잔존 → phase 전환 X
- 버그 2: groundLayerMask=~0 (모든 layer) = Enemy/Player Collider 거짓 양성 → 절벽 영역 미검출

정정 (BT81):
1. stuckTimer 영역 신규:
   - _lastX·_stuckTimer 추가
   - 매 frame |transform.x - _lastX| < 0.01 시 _stuckTimer 누적
   - _stuckTimer > 0.5초 시 = 벽 정지 → 다음 phase 강제
2. groundLayerMask: ~0 → (1 << 0) | (1 << 16) — Layer 0 (지면) + Layer 16 (발판)만
3. cliffCheckDepth: 0.8 → 1.5 — 지면 검출 깊이 증가
4. Inspector 노출: stuckThresholdTime 신규 (기본 0.5초)

효과:
- 벽 정지 시 0.5초 후 자동 phase 전환 (다음 patrol 방향 시도)
- 절벽 검출 = Layer 0/16만 = Enemy/Player 거짓 양성 차단
- 시작 위치 복귀 영역 그대로

후속 의무:
- PD Refresh+Play 시각 검증
2026-05-08 11:33:57 +09:00
깃 관리자 3591bd218f BT5-Dev #80: 몬스터 y+0.5 + 자동 patrol + 절벽 검출 (PD 3건 일괄)
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 = 발 영역 지면 위 정합
2026-05-08 11:28:35 +09:00
깃 관리자 8df09a7feb BT5-Dev #79: Enemy flipX 영역 PlayerController 정합 (PD 명시 채택)
PD 명시 (2026-05-08): "몬스터도 캐릭터와 같이 리소스를 반대로 재생시켜야 해"

근본 원인:
- AnimationController.cs (Enemy 영역) flipX 영역:
  - 우측 이동 시 flipX = false
  - 좌측 이동 시 flipX = true
- PlayerController.cs (Hero1 영역) flipX 영역:
  - 우측 이동 시 flipX = true
  - 좌측 이동 시 flipX = false
- = 반대 영역. M001 sprite (좌측 향함) 기준 Enemy 영역 우측 이동 시 sprite 그대로 = 후방 이동 영역.

정정 (true·false 반전):
- 우측 이동 시 spriteRenderer.flipX = true
- 좌측 이동 시 spriteRenderer.flipX = false
- = PlayerController·Hero1 영역과 동일 영역 정합

PD 추가 보고 진단 (첫 번째 등장 몬스터 정지):
- Scene Enemy prefab 인스턴스 16개 중 5개 path 미설정 (#3·#9·#11·#13·#14)
- path null = mover null = move.x = 0 = 정지
- pos.x 카탈로그: #13(7.79·path=0) #3(24.49·NO_PATH) #14(42.91·NO_PATH) #11(82.28·NO_PATH) #9(139.27·NO_PATH)
- = PD 시각 첫 번째 등장 = pos.x 가장 작은 영역 가설 (#13 또는 #3)
- 정정 영역 = PD가 Editor에서 path 영역 직접 부여 의무 (PatrolPath GameObject Inspector 영역 drag·drop)
2026-05-08 01:05:32 +09:00
깃 관리자 aa0b188d14 BT5-Dev #78: M001 sprite fileID 영역 정확 매핑 (BT76·BT77 정정)
PD 보고 (2026-05-08): "몬스터 이미지가 전혀 안보여"

근본 원인:
- M001 sprite mode = Multiple (2)
- Multiple mode 영역 fileID = .meta internalIDToNameTable 영역의 internalID (음수 가능)
- 본 PM 가설 = fileID 21300000 (Single mode 영역) → 부정확
- Enemy.prefab + 4 .anim 영역 모두 sprite reference 영역 fileID 미존재 GUID로 매핑 → 시각상 X

정정 (Python 자동):
- 각 M001 sprite .meta 영역 internalIDToNameTable 영역 213 영역 internalID 추출
  (예: M001_idle01 = -7548370174848201806)
- 4 .anim 영역 m_PPtrCurves 영역 keyframe별 정확 internalID 영역 매핑
- Enemy.prefab m_Sprite fileID = M001_idle01 internalID

매핑 수정 영역:
- Enemy.prefab Sprite: fileID -7548370174848201806 + guid M001_idle01
- EnemyIdle.anim: 48 keyframes M001_idle 4 frames (4-cycle)
- EnemyRun.anim: 15 keyframes M001_run 5 frames (5-cycle)
- EnemyHurt.anim: 9 keyframes M001_hit 2 frames (2-cycle)
- EnemyDeath.anim: 8 keyframes M001_death 4 frames (4-cycle)

후속 의무:
- PD Refresh+Play 시각 검증 (M001 늑대 sprite 표시 정합)
2026-05-08 01:00:19 +09:00
깃 관리자 a11a52a50e BT5-Dev #77: 몬스터 2차 .anim sprite 영역 M001 늑대 매핑
PD 명시 (2026-05-08): "1차 2차 모두 순차적으로 일괄 진행"

2차 = 4개 .anim 영역 sprite reference 영역 M001 순환 매핑 (Python 자동):
- EnemyIdle.anim: 48 keyframes → M001_idle 4 frames (4-cycle, 12회 반복)
- EnemyRun.anim: 15 keyframes → M001_run 5 frames (5-cycle, 3회 반복)
- EnemyHurt.anim: 9 keyframes → M001_hit 2 frames (2-cycle)
- EnemyDeath.anim: 8 keyframes → M001_death 4 frames (4-cycle, 2회 반복)

매핑 알고리즘:
- m_PPtrCurves 영역 keyframe별 sprite reference 영역 (fileID, guid, type)
- keyframe_index % m001_frame_count → M001 frame 순환 매핑
- fileID = 21300000 (Multiple sprite mode 첫 sprite)

1차 (BT76 commit 020a220) + 2차 (본 commit) = 일괄 진행 결과:
- Enemy.prefab 정지 sprite = M001_idle01 (BT76)
- 4 모션 애니메이션 = M001 frames 순환 (BT77)

attack 영역 후속 권고:
- Enemy.controller 영역 attack state 미존재 (현재 4 motion만 — Idle·Run·Hurt·Death)
- attack 영역 추가 시 신규 .anim 영역 + controller 영역 state·transition 신규 의무 (큰 분량)
- PD 결정 영역
2026-05-08 00:58:31 +09:00
깃 관리자 020a2206c0 BT5-Dev #76: 몬스터 1차 sprite 교체 — M001 늑대 (Enemy.prefab SpriteRenderer)
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 명시)
2026-05-08 00:55:54 +09:00
깃 관리자 2ebacf636c BT5-Dev #75: 발판 시스템 영구 마무리 — 시행착오 주석 정리·dead code 제거
PD 명시 (2026-05-08): "플레이어 조작 시스템 완성. 시행착오로 불필요하게 생성된 코드·작업물 제거 + 최신 상태로만 깔끔하게"

정리 영역:

1. GameOptimizer.cs (Write 전체 재작성):
   - 헤더 주석 — BT5-Dev 발판 시스템 영구 영역 명시 + 동작 요약 5단계
   - BT34·BT46·BT66·BT67·BT48·BT63·BT68 시행착오 주석 영역 통합 정리
   - Debug.Log 영역 통합 1행 ([GameOptimizer] 출력)
   - IsSmallAirPlatform 헬퍼 영역 보존 (BT48 휴리스틱 사용 중)

2. PlayerController.cs (Edit 부분 정리):
   - dropThroughTimer·jumpAscentTimer 변수 영역 주석 정리
   - OnCollisionEnter2D BT30-Collide 진단 Debug.Log 영역 폐기 (시행착오)
   - BT69·BT70·BT71·BT72·BT73·BT74 시행착오 주석 영역 통합 정리
   - UpdateContactFilterForDropThrough 영역 메서드 docstring 추가

3. KinematicObject.cs (Edit 부분 정리):
   - BT68 X·Y 분리 영역 주석 정리

영구 채택 영역:
- R2 (BT66): AutoForeground GameObject 분리 + PD Foreground = 가림막 시각만
- BT67: AutoForeground transform 동기화 (PD Foreground·Level 영역과 동일)
- BT68: KinematicObject X·Y 분리 + GameOptimizer TileGround* 자동 분류 제외
- BT69~BT74: Drop-Through (Down + Jump) Input 패턴 + 가장자리 jitter 차단

플레이어 조작 시스템 완성:
- 발판 위 착지·점프 통과·자유 이동
- Down + Jump = Drop-Through (발판 위만)
- 전진 점프 시 앞 벽 hit + 위로 점프 보존
- 대각선 벽 통과 X (TileGround* Level 잔존)
- 발판 가장자리 jitter 차단 (3점 Raycast + 밀림 강제 Drop-Through)
2026-05-08 00:49:26 +09:00
깃 관리자 5b199cbe6f BT5-Dev #74: 발판 가장자리 밀림 시 강제 Drop-Through (PD 권고 채택)
PD 권고 (2026-05-08): "한번이라도 밀리면 아래로 강제로 떨구어야하지 않을까?"

진단:
- BT73 후 footHit 3점 안정화에도 특수 영역 잔존
- 점프 정점(velocity.y ≈ 0) + 수평 이동 시도 + 발판 가장자리 = 발판 일시 검출
- = standingOnPlatform=true → mask ON → body.Cast 충돌 → 수평·수직 정지
- = '밀린 상태 고정'

정정 (BT74 — UpdateContactFilterForDropThrough 영역 추가):
밀림 상태 검출 4조건 AND 결합:
1. standingOnPlatform=true (footHit 3점 검출)
2. inAir = jumpState == Jumping || jumpState == InFlight (점프·낙하 중)
3. nearApex = velocity.y > -1.5f (정점·낙하 초기)
4. horizontalIntent = Mathf.Abs(move.x) > 0.1f (수평 이동 시도)

검출 시 강제 Drop-Through:
- dropThroughTimer = DROP_THROUGH_DURATION (0.3초 mask 강제 OFF)
- standingOnPlatform = false (즉시 해제)
- = Player 발판 통과 + 자연 낙하 시작

효과:
- 발판 가장자리 정점 + 수평 이동 시 = 강제 통과 (밀림 X)
- 정상 착지 (velocity.y < -1.5 빠른 descending) = 영역 외 → 그대로 착지
- 발판 위 정지 (Grounded·수평 입력 X) = 영역 외 → 그대로
- ascending·Drop-Through·일반 점프 = 그대로

후속 의무:
- PD Refresh+Play 시각 검증 (특수 재현 경로 + 다양한 점프 영역)
2026-05-08 00:43:25 +09:00
깃 관리자 40c0509e02 BT5-Dev #73: footHit 3점 Raycast (발판 가장자리 jitter 정정)
PD 보고 (2026-05-08): "발판 끝에서 내려오기 직전 아래 방향 유지 + 발판방향 이동 시 밀려남"

진단:
- BT72 후도 descending 시 standingOnPlatform 검사 활성
- footHit Raycast 단일 (중앙) 영역 = 발판 가장자리 진입 시 검출 X·검출 O frame 교차
- = jitter (mask ON·OFF 진동) → 미세 밀려남

정정 (BT73):
- footHit Raycast 좌·중·우 3점 추가
  - footY = collider2d.bounds.min.y + 0.02f
  - boundsLeft = collider2d.bounds.min.x + 0.02f
  - boundsCenter = collider2d.bounds.center.x
  - boundsRight = collider2d.bounds.max.x - 0.02f
- standingOnPlatform = 3점 OR 결합 (어느 하나라도 검출 시 true)
- = 발판 가장자리 영역 안정 검출

효과:
- 발판 가장자리 영역 진입 시 standingOnPlatform 안정 (jitter 차단)
- 발판 위 착지 정합 (3점 중 1점 검출 영역 충분)
- ascending·Drop-Through·일반 점프 영역 그대로

후속 의무:
- PD Refresh+Play 시각 검증 (특수 재현 경로 — 발판 끝 + Down + 발판 방향 이동)
2026-05-08 00:37:58 +09:00