PD 보고: "독늪이 플레이어 위치에서 생성될 경우 플레이어의 Y값에서
-0.5정도 아래의 위치에 생겨야할거 같아"
직전 commit 3c5a3bc 의 Player fallback ground Raycast 영역 — Player
ground 위 발판 hit (예: -2.61) → spawn 위치 ground 표면. PD 의도는
Player.y - 0.5 직접 (시각 정합·발 아래 한 키 정도).
분기 정정:
- nearest != null (지상 Enemy 후보): Enemy 위치 ground Raycast (기존 영역)
- nearest == null (공격 가능 적 없음·Player fallback):
spawnPos = (playerPos.x + OffsetXY.x, playerPos.y - 0.5 + OffsetXY.y)
· ground Raycast 폐기 · PD 명시 수치 직접
검증 (Play 모드):
- 비박쥐 13기 사망 + 박쥐 1기만 (IsFlying skip)
- Player pos=(-15.14, -2.21) · OffsetXY=(0, -0.4)
- Swamp pos=(-15.14, -3.11) = Player.y - 0.5 + OffsetXY.y(-0.4) 정합
OffsetXY는 PD Inspector 추가 미세 조정 영역 (현 -0.4).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PD 추가 보고: "여전히 독 늪이 공중 몬스터의 Y 위치에 발생되고 있어.
공격 가능한 적이 없을 경우(공중 몬스터만 있을 경우 등) 독 늪이
플레이어 X 위치에서 이동 가능한 영역 바닥에 생성 되도록 해줘."
원인: 직전 commit 2516ef9 의 e.IsFlying check 영역 — Enemy.Awake/Start
호출 순서·controller late assign race 시 IsFlying=false 잔존 가능 →
박쥐 nearest 후보 영역 → 박쥐 y 위치 spawn (Raycast hit 후 ground y 사용
하더라도 박쥐가 ground 위에 있다면 박쥐 위치 그대로).
정정: PoisonSwampSpawner.Trigger 루프 영역 e.RecheckFlyingFromAnimator()
강제 호출. Animator.runtimeAnimatorController.name 영역 flyingControllerNames
list 매칭 → IsFlying 즉시 갱신.
검증 시나리오 (Play 모드):
- 비박쥐 Enemy 13기 사망 처리 (Player 주변 박쥐 1기만 남김)
- 박쥐 1기 IsFlying=True 정합
- A06 발사 → spawn pos=(-15.14, -2.61) = Player.x(-15.14) + ground.y(-2.61)
- 박쥐 y=-2.00 위치 영역 spawn 안 됨 (차단 정합)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PD 보고: "독 늪은 공중에 생성 되지 않도록 수정해줘. (플레이어나
몬스터가 밟고 이동할 수 있는 영역에만 생성 가능해야 함)"
정정 PoisonSwampSpawner.Trigger:
1. nearest Enemy 탐색에서 IsFlying=true (박쥐 등) skip
- 공중 박쥐 위치 spawn 후보 제외
2. spawn 후보 (nearest 또는 Player 위치 + OffsetXY) 에서
Vector2.down Raycast (거리 20, groundLayerMask Layer 0 + Layer 16)
3. Raycast hit X → return (spawn 차단)
4. Raycast hit O → spawnPos.y = groundHit.point.y (ground 표면 위)
groundLayerMask = (1 << 0) | (1 << 16):
- Layer 0 : Level Tilemap (메인 ground)
- Layer 16: Floating 발판 (Foreground)
검증 (Play 모드):
- 시나리오 1 (Player 지면): spawn 1기·pos.y=-2.88 (ground 위)
- 시나리오 2 (Player y=50 공중·모든 Enemy IsFlying): spawn 증가 0 (차단)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PD 보고: "정령불의 피격 범위에 있는 적은 EnableRepeatDamage가
체크되어있는데도 피해를 받지 않고 있어"
직접 진단 — Play 모드 [SpiritFire][Tick] Debug.Log 측정:
- 박스 center·size 정합 · OverlapBox enemyHit=1·dmg=5 6회 호출 확인
- A11 hit·damage 자체는 정상 동작
진짜 원인: DecrementBypassInvuln (DoT 함수·hit 모션·flash 발화 X)
호출. Enemy maxHP=99999 → 매 초 5 감소 = 시각상 변화 X·hit flash X
→ PD 인식상 "피해 X".
정정:
- DecrementBypassInvuln → DecrementBypassInvulnWithHit
- A05·Laser·Lightning·MeleeArea 동일 패턴 (hit 모션 + 붉은 flash 1f)
- A06 PoisonedEnemyMarker 영역 DoT 표현 의도라 DecrementBypassInvuln 유지
부속:
- 진단 Debug.Log 회수 (목적 달성)
검증 (Play 모드 직전 측정·진단 회수 전):
- center=(-13.81, -2.28) totalHit=3 enemyHit=1 dmg=5 (6회 연속 출력)
- A11 매 DotInterval 1초 hit 정합
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PD 요청:
1. 정화의 빛 (A12) 판정 범위 2개 필요
2. 모든 스킬 영역 — 체크박스로 추가 판정 범위 지정 가능
ActiveSkillData 신규 필드 (Header "2차 판정 박스 (선택)"):
- bool EnableSecondHitbox 체크박스 (기본 false)
- Vector2 SecondHitboxSize (기본 (1.5, 1.0))
- Vector2 SecondOffsetDistance (기본 (0, 0))
MeleeAreaSpawner.cs 분리·일반화:
- SpawnHitboxVisual static helper 신규 (1차·2차 박스 공통)
- DoOverlapBoxAt static helper 신규 (1차·2차 판정 공통)
- Trigger 영역 EnableSecondHitbox 분기 → 2차 박스·이펙트 위치 spawn
- DoOverlapBoxFromPlayer 영역 EnableSecondHitbox 분기 → 2차 판정 위치 OverlapBox
- facing sign 1차·2차 동일 적용 (좌/우 일관 반전)
A12_jeonghwauibit.asset placeholder (PD Inspector 미세 조정 가능):
- HitboxSize: (4,4) → (1.5, 5) 1차 vertical 줄기
- OffsetDistance: (0,0) → (0, 3) Player 위쪽 3
- EnableSecondHitbox: 1
- SecondHitboxSize: (1.5, 5) 2차 vertical 줄기
- SecondOffsetDistance: (0, -3) Player 아래쪽 3
검증 (Play 모드):
- A12 발사 → MeleeHitbox_Debug + MeleeHitbox_Debug2 동시 spawn
- 1차 pos.y = Player(-2.18) + offset.y(+3) = 0.82 ✓
- 2차 pos.y = Player(-2.18) + offset.y(-3) = -5.18 ✓
- 각 박스 scale = (1.5, 5) vertical 줄기 정합
후속: Laser·Lightning·Projectile spawner 영역 SecondHitbox 적용은
PD 요청 발생 시점에 동일 패턴 (Helper extract → 2차 분기) 정합.
공통 필드는 본 commit 으로 일괄 추가.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PD 보고 + Console 로그 결정적:
"[Projectile][WallHit-OnTrigger] cardId=A02 other=PoisonSwamp_Collider
parent=FX_Venom_Swamp(Clone) layer=0(Default) isTrigger=True
pos=(-7.30, -0.30, 0.00) dist=5.00/8"
원인: 직전 commit 708ba08 isWall = (Layer 0) 정정 후에도 A06 독 늪
PoisonSwamp_Collider (Layer 0 + isTrigger=true) 가 Wall 판정 통과 →
빠른 투사체 (A02 dist=5/8 = 62.5%) 조기 SelfDestruct.
느린 A13 정상은 0.1초 grace 통과 + 짧은 거리 우연 회피.
정정:
- isWall = (Layer 0) && !other.isTrigger
- Level Tilemap (non-trigger) 만 Wall 차단
- Effector spawn trigger collider (A06 독 늪·CinemachineConfiner·
Token·DeathZone·기타 Layer 0 Trigger) 모두 통과
Wall OverlapPoint (Update L186) 영역 이미 filter.useTriggers=false 로
trigger 제외 정합 — 변경 불필요.
진단 Debug.Log 2건 회수 (목적 달성).
검증 (PD Play 확인 필요):
- A02 (속도 6)·A08·A14·A15 빠른 투사체 MaxRange 까지 정상 비행
- 독 늪 범위 통과
- Level Tilemap 벽 충돌 시 SelfDestruct 유지
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PD 보고 2건:
1. "투사체 판정 범위를 다시 보여줘"
2. "파이어볼이나 저주의 화살과 같은 투사체 형태는 여전히 맵이
연결되는 경계선을 넘지 못하고 제자리에서 멈추다가 소멸하고 있어.
(단, 속도가 느린 투사체는 정상적으로 날아감)"
정정:
1. HitboxDebug.ShowDebugVisuals false → true
- Range_Debug (파란 박스)·ProjectileHitbox_Debug (붉은 박스)·
LaserHitbox_Debug·MeleeHitbox_Debug·Hitbox_Debug 일괄 노출.
- SpriteRenderer.enabled toggle 만 — GameObject·LiveHitboxSync 부착 정상.
2. Projectile.OnTriggerEnter2D Wall hit 시 + Update Wall OverlapPoint
hit 시 진단 Debug.Log 추가:
- [Projectile][WallHit-OnTrigger] cardId·other.name·parent·layer·
isTrigger·pos·dist/maxRange
- [Projectile][WallHit-OverlapPoint] cardId·hit.name·parent·layer·
pos·dist/maxRange
PD Play 후 Console "[Projectile][WallHit-*]" 로그 + 박스 시각으로
어떤 collider 가 빠른 투사체 (A02·A08·A14·A15) 를 차단하는지
정확 식별. 본 PM 후속 정정 시 회수 의무.
원인 가설: 직전 commit 708ba08 Layer 16 제외 후에도 잔존 →
다른 collider (CinemachineConfiner Trigger·InfiniteHorizontalGround
Left/Right 자식·Background segment 등) hit 가능성.
A13 (속도 2.5) 정상·A02 (속도 6)·A08 영역 차단 — 빠른 투사체에서만
재현 패턴 정합.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PD 추가 진단 (스크린샷 + 발화): "게임 플레이 후 스크롤 되는 맵에
여전히 남아있는 상태야. 아마 스크롤 되며 연장되는 맵 영역이
초기화 되지 않는 것으로 예상 돼"
이전 commit ea239fe (3중 진입점 + FX clone prefix) 의 catch 누락
가능성 차단:
1. PlayerSkillInventory.DoCleanupStalePooledSpawns 영역
Resources.FindObjectsOfTypeAll → Scene.GetRootGameObjects + 재귀
변경. hideFlags hidden GO 누락 우려 제거·정확도 향상.
CollectStaleRecursive 신규 — 자식 트리 재귀 탐색.
IsStaleByName 헬퍼 — 이름 매칭 통합.
2. Projectile.Awake 신규 — _data == null && _runtime == null 상태
(= Initialize 미호출 잔존) 시 1 frame 유예 후 자기 destroy.
PlayerSkillInventory cleanup 누락 케이스 자체 정리 (2중 방어).
InfiniteHorizontalBackground·기타 컴포넌트 자식 부착된 잔존도
본 자가 destroy 로 catch.
측정 (Play 진입 직후):
- AfterSceneLoad static cleanup removed=0
- Awake cleanup removed=0
→ 이전 Play 잔존 = 0건 (Scene load·Awake 시점)
→ Hierarchy 영역 시각상 spawn = 자동 발사 진행 결과
후속: PD Refresh + Play → 화면 잔존 재확인 필요.
잔존 시 Console "[PlayerSkillInventory] ... removed=N" 로그 +
스크린샷 으로 본 PM 추가 진단.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업 1 — 피격 이펙트 상위 sortingOrder:
- Projectile.OnTriggerEnter2D OnHitFx — Renderer.sortingOrder += 100
- LightningStrikeSpawner OnHitFx + ExtraHitFx — 동일
- MeleeAreaSpawner fxGo — 동일
- LaserSpawner fx — 동일
- Enemy SpriteRenderer 영역 위·뒤쪽 가림 회피
작업 2 — 적 추적 각도 하단 보정:
- ProjectileSpawner.Trigger TargetEnemyOnFire 영역 toEnemy.y -= 0.5
- 적 transform.position 영역 상단 영역·hitbox 영역 영역 영역 적중 정합
- A08 영역 영역 영역 영역 영역 영역 적 hitbox 영역 영역 영역 적중
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업 1 — 캐스팅 이펙트 제거:
- A08.asset OffsetDistance.x 1.5 → 0 (Player 위치 spawn)
- A08.asset CastFxPrefab null
작업 2 — 가장 가까운 적 방향 발사:
- ActiveSkillData.TargetEnemyOnFire (bool) 신규 필드
- ProjectileSpawner.Trigger — TargetEnemyOnFire=true 시 FindObjectsByType<EnemyController> 영역 nearest 검출·facing = (enemyPos - playerPos).normalized
- 적 0명 시 PlayerController.Facing fallback (기존 정합)
- A08.asset TargetEnemyOnFire=1
벽·발판 관통 X — Projectile.Update 영역 Layer 0·16 OverlapPoint 영역 영역 영역 정합 (변경 X).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
원인: SelfDestruct 영역 즉시 Destroy(gameObject) → ParticleSystem 영역 진행 영역 trail·glow particle 즉시 사라짐 → 발사 영역 영역 영역 매번 시각 cut → "뚝뚝 끊기는" 인식.
fix:
- _fadeOutStarted flag — 중복 호출 차단
- Collider2D·_debugBoxTransform disable — 판정 종료
- _speed = 0 — 이동 정지
- ParticleSystem.Stop(true, StopEmitting) — emission 정지·기존 particle 자연 fade
- Destroy(gameObject, 0.5f) — 0.5s 후 Destroy (기존 particle lifetime 영역 자연 fade 완료)
- FADE_START_RATIO 0.8 → 0.85 (sprite fadeout 영역 영역 영역·자연 영역 영역)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
원인: fx.transform.localScale *= HitFxScale 영역 적용·그러나 ParticleSystem.MainModule.scalingMode 영역 = Local·Shape 영역 영역 영역 root scale 영역 영역 X·ParticleSystem 영역 자체 size 영역 영역 영역 영역.
fix: 모든 fx spawn 영역 ParticleSystem foreach 영역 영역 ScalingMode = Hierarchy 설정 + Play(true) 동시. Hierarchy 영역 = parent Transform scale 영역 정합 적용.
전수 적용 (7 파일):
- Projectile.OnTriggerEnter2D — OnHitFx
- ProjectileSpawner.Trigger — CastFx + ProjectilePrefab
- MeleeAreaSpawner.Trigger — fxGo
- LightningStrikeSpawner — OnHitFx + ExtraHitFx
- LaserSpawner.Trigger — fx
- PoisonSwampSpawner — swampGo + Marker.Tick fx
- SpiritFireSpawner — shieldGo
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업 1 — 캐스팅 이펙트 끝 지점 영역 투사체 발사:
- A08.asset OffsetDistance.x: 0 → 1.5
- ProjectileSpawner.Trigger 영역 spawnPos = playerPos + facing × 1.5 영역 캐스팅 끝 지점
- (FX_PinkArrow_Shoot 캐스팅 길이 영역 1.5 unit 추정·PD 측정 후 미세 조정 가능)
작업 2 — Hit FX 발사 시 Player 위치 발생 회피:
- 원인 추정: spawn 위치 = Player 위치 + OffsetDistance·작업 1 이전 OffsetDistance=0 영역 Player 위치 spawn → Player 근접 Enemy 즉시 hit → OnHit FX = Enemy 위치 ≈ Player 위치 → "Player에게 발생" 인식
- 작업 1 영역 spawn 위치 영역 Player 영역 1.5 우측 이동 → 자동 정정
- Projectile.OnTriggerEnter2D 영역 spawn 직후 0.1초 grace period 추가 (Time.unscaledTime - _spawnTime < 0.1f 영역 return) — 즉시 hit 차단·OnHitFx Player 위치 표시 회피
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
원인: CastFx Instantiate 영역 = Quaternion.Euler(0, 0, data.FxRotation) (=0) 영역. FX_PinkArrow_Shoot sprite left 기본 → 시전 영역 sprite left 표시·Player right 발사 방향과 반대.
fix:
- ProjectileSpawner.Trigger CastFx — facing angle + ProjectileAngleOffset + FxRotation 적용 (Projectile 본체 동일 패턴)
- 진단 Debug.Log 2종 회수 ([ProjectileSpawner] card·CastFx spawned·[Projectile] OnHit) — fileID 정정 완료·root 원인 확정 후 revert
A08 영역 ProjectileAngleOffset=180 영역 정합 (sprite left → right) → CastFx·Projectile 동일 방향.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
원인: 직전 aa6cef1 영역 Debug.Log interpolated string 영역 `\"NULL\"` escape 사용·C# interpolated string escape 미지원 → 컴파일 에러.
fix: ternary 결과 영역 변수 분리 (castName·projName·hitName).
본 PM 자성 #15 — Edit 후 컴파일 사전 검증 누락. Unity Editor 영역 컴파일 영역 영역 영역 본 PM 영역 X 영역 영역 = PD 영역 보고 후 영역. C# string escape 영역 사전 측정 의무.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
A08.asset 영역 ProjectilePrefab·OnHitFxPrefab·CastFxPrefab GUID 정합 측정 정합·코드 정합. 그러나 PD 영역 시전·피격 X 보고 → 실측 진단 필요.
진단 Log 2종 (회수 의무·PD Console 측정 후 본 PM revert):
- ProjectileSpawner.Trigger — [ProjectileSpawner] card·CastFx·ProjPrefab·OnHitFx 매핑 측정·CastFx spawn 확인
- Projectile.OnHit — [Projectile] OnHit card·OnHitFx spawn name·pos 확인
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
원인: FX_PinkMagicArrow prefab sprite 기본 방향 left·Projectile.Initialize 영역 atan2(facing)·우향 발사 시 sprite left 보임.
fix:
- ActiveSkillData.ProjectileAngleOffset (float, Range -360~360) 신규 필드 — prefab sprite 기본 방향 보정용
- Projectile.Initialize — angle = atan2 + ProjectileAngleOffset
- A08.asset — ProjectileAngleOffset 180 설정 (FX_PinkMagicArrow left → right 보정)
박스(판정) 영역 = 동시 회전·HitboxSize 대칭 가정 영역 영향 X.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
직전 b1b476a 영역 PoisonSwamp·SpiritFire 영역만 명시 Play 적용·나머지 4 Spawner + Projectile 영역 누락.
전수 적용:
- MeleeAreaSpawner.Trigger — OnHitFx (A05·A12 등) 영역 Play
- LightningStrikeSpawner.Trigger — OnHitFx·DelayedExtraHitFx Play
- LaserSpawner.Trigger — fx (A_Laser OnHit) Play
- ProjectileSpawner.Trigger — ProjectilePrefab (A02·A08 FX_PinkMagicArrow 등)·CastFxPrefab (A08 FX_PinkArrow_Shoot) Play
- Projectile.OnTriggerEnter2D — OnHitFx (A02·A08 등) Play
원인: 신규 import prefab 영역 playOnAwake 영역 정합 X 가능성 또는 Instantiate 시점 영역 Awake 호출 X·명시 Play 안전망 누락.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
원인 추정:
- PoisonSwampInstance 영역 BoxCollider2D·Rigidbody2D 영역 FX root 직접 부착 → ParticleSystem 영역 영향 가능
- Instantiate playOnAwake 정합·그러나 명시 Play() 호출 안전망 영역 누락
fix:
- PoisonSwampSpawner.Trigger — FX root 영역 GetComponentsInChildren<ParticleSystem>(true) 영역 명시 ps.Play(true)
- PoisonSwampInstance — BoxCollider2D·Rigidbody2D 영역 자식 GO 분리 (PoisonSwamp_Collider)·FX root 영역 visualRoot 보관·duration 종료 시 함께 Destroy
- PoisonedEnemyMarker.Tick — FX_Venom_Spray 영역 동일 ParticleSystem.Play(true) 명시 호출
- SpiritFireSpawner.Trigger — 동일 명시 Play(true) 호출
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
신규 Effector 2종:
- PoisonSwampSpawner — Category C (PlacementPersistent)
· 가장 가까운 적 위치 spawn·6초 유지·BoxCollider2D isTrigger·Kinematic Rigidbody2D
· PoisonSwampInstance — OnTriggerStay 영역 적 마킹·PoisonedEnemyMarker 부착·duration 5초 갱신
· PoisonedEnemyMarker — 매 초 10 피해·FX_Venom_Spray 자식 spawn (DotFxPrefab)·duration 만료 시 자가 소멸
- SpiritFireSpawner — Category D (Minion)
· Player 자식 spawn·8초 유지·OverlapCircle radius 2.5
· SpiritFireInstance — 매 초 근접 적 5 피해·Time.unscaledTime 영역 lifecycle
SkillFireEvent.Execute switch 확장:
- PlacementPersistent case → PoisonSwampSpawner
- Minion case → SpiritFireSpawner
A06 독 늪 .asset 신규 — Category 2·BaseCooldown 10·BaseDamage 10·OnHitFxPrefab=FX_Venom_Swamp·OnDotFxPrefab=FX_Venom_Spray
A11 정령불 .asset 신규 — Category 3·BaseCooldown 15·BaseDamage 5·MinionLifetime 8·OnHitFxPrefab=FX_Rotating shield
SkillRuntimeFactory.AvailableCardIds — A06·A11 추가 (7→9종)
TestSkillFireOn1to5 — PoisonSwamp·SpiritFire 인스턴스 신규·Category 분기 추가 (CardId 기반 MeleeArea 분기 정합)
PD Inspector 영역 — Player.prefab TestSkillFireOn1to5 Skill1=A06·Skill2=A11 .asset drag&drop 필요.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
원인: LightningStrikeSpawner.Trigger 영역 candidates.Count == 0 시 즉시 return → 적 0명 영역 발동 X.
fix: candidates 0 시 Player 위치 영역 fallback (primaryPos = inventory.transform.position) → 일정 쿨타임 자동 발동.
A05 MeleeAreaSpawner·A_Laser LaserSpawner = Player 위치 기준 발동·적 무관 영역 이미 정합.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업 1 — 스킬 배워도 이펙트 X fix:
- SkillFireEvent.Execute — MeleeArea case 추가 (CardId 분기·TestSkillFireOn1to5 동일 패턴)
- A04 → LightningStrikeSpawner
- A_Laser → LaserSpawner
- 기타 → MeleeAreaSpawner
작업 2 — 맵 이동 중 이펙트 잔상 재발 fix:
- 원인: Object.Destroy(fxGo, t) 영역 second timer 영역 Time.timeScale 영향·timeScale=0 (LevelUp) 영역 호출 정지
- 신규: FxAutoDestroyUnscaled MonoBehaviour — Update 영역 unscaledTime lifetime check 자가 Destroy
- ProjectileSpawner·Projectile·MeleeAreaSpawner·LaserSpawner·LightningStrikeSpawner 모두 영역 Object.Destroy(fx, t) → FxAutoDestroyUnscaled.Attach
- LightningStrikeSpawner.DelayedExtraHitFx — WaitForSeconds → WaitForSecondsRealtime (timeScale=0 영역 정합)
본 PM 자성 #12 — feedback_new_code_existing_system_dependency_unmeasured 위반. Object.Destroy(go, t) 영역 timeScale 영향 사전 측정 누락 (Unity 표준 API).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
근본 원인:
- Time.timeScale=0 (LevelUp 카드 선택 모드) 영역 Time.time 정지 → Invoke(SelfDestruct, lifetime) 영역 호출 X → 영원 잔존
- _spawnTime = Time.time 영역 = lifetime backup check 영역 영역 X
fix:
- _spawnTime = Time.unscaledTime (timeScale 무관)
- Update 영역 lifetime check — Time.unscaledTime - _spawnTime > _lifetime 영역 강제 SelfDestruct
- Wall grace period — Time.unscaledTime 영역 정합
- Invoke 폐기·CancelInvoke 추가 안전 (Initialize 영역 잔존 Invoke 차단)
본 PM 자성 #11 — Time.time vs Time.unscaledTime 영역 사전 측정 누락. Projectile 영역 lifecycle 영역 timeScale 영역 영향 영역 사전 측정 의무 누락.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업 1 — 죽는 모션 종료 시점 팝업 UI:
- LevelUpManager — Player 사망 상태 영역 HandleLevelUp 호출 시 _pendingLevels 영역 저장
- Update 영역 매 frame Player IsAlive·!_isLevelUpActive check → pending 영역 ShowLevelUpUI 표시
- 죽는 모션 동안 LevelUp 즉시 표시 X·부활 후 표시
작업 2 — Player 사망 모션 y -0.3 추가 (누적 -0.6):
- PlayerDeath.Execute — new Vector3(0f, -0.6f, 0f)
작업 3 — 투사체 잔상 강화 fix + 진단:
- Projectile.Update — lifetime + 0.5 backup 강제 SelfDestruct (Invoke 누락 안전망)
- Projectile.Initialize — [Projectile][Initialize] 진단 Log (회수 의무)
- ProjectileSpawner.Trigger — [ProjectileSpawner] 진단 Log (회수 의무)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
원인: ProjectileSpawner.Trigger 영역 BoxCollider2D.isTrigger=true 활성 (단계 2) 직후·Initialize (단계 3) 이전 OnTriggerEnter2D 발화 가능 → _runtime=null → NullReferenceException line 187 → SelfDestruct 미호출 → 영구 잔존.
fix:
1. OnTriggerEnter2D 영역 `_runtime == null || _data == null` defensive return
2. Update 영역 `_data == null` 시 즉시 SelfDestruct (잔존 차단)
본 PM 자성 #10 — race condition 사전 측정 누락. ProjectileSpawner.Trigger 영역 collider 부착 시점·Initialize 호출 시점 영역 사이 OnTriggerEnter2D 발화 가능성 사전 측정 X.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업 1 — Player 죽는 모션 X fix:
- PlayerDeath.Execute — SetTrigger("hurt") → SetTrigger("hit") (Player.controller parameter 정합: velocityX·velocityY·grounded·attack·dead·hit·combatidle·resurrect·hurt 없음)
- animator.updateMode = AnimatorUpdateMode.UnscaledTime 추가 (EnemyDeath 영역 동일·timeScale=0 영향 차단)
작업 2 — 부활 모션 중 움직임 fix:
- PlayerSpawn.Execute — Rigidbody2D.simulated=true 복원 폐기 (즉시 X)
- EnablePlayerInput.Execute — Rigidbody2D.simulated=true 복원 추가 (2초 후·부활 모션 종료 시점)
- using UnityEngine 추가 (CS0246 회피)
작업 3 — 투사체 잔상 진단 (회수 의무):
- Projectile.SelfDestruct — [Projectile][SelfDestruct] Debug.Log
- Projectile.OnDestroy — [Projectile][OnDestroy] Debug.Log (Destroy 외 경로 검출용)
- PD Console 측정 결과 영역 본 PM 근본 fix 후 revert
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업 1 — Player 사망 사라지는 현상 fix:
- PlayerDeath.Execute — Rigidbody2D.simulated=false (gravity 정지·제자리 사망·낙사 차단)
작업 2·3 — 제자리 부활·부활 모션·2초 무적 깜박:
- PlayerSpawn.Execute — Teleport 폐기 (spawn point 영역 → 제자리)
- player.health.Resurrect() 호출 (currentHP=maxHP·invulnerableUntil=2초·Animator dead=false·resurrect Trigger)
- Rigidbody2D.simulated=true 복원
- PlayerInvulnerabilityFlash 영역 IsInvulnerable 자동 깜박 (2초)
- 2초 후 EnablePlayerInput (조작 가능)
작업 4 — FX 잔상 safety cap 5초:
- LaserSpawner.Trigger — fx Object.Destroy 누락 fix (LaserSpawner 영역 본 영역 영역 영역 직접 원인 가능)
- LightningStrikeSpawner.AutoDestroyFx — cap
- MeleeAreaSpawner.Trigger — cap
- Projectile.AutoDestroyOnParticleEnd — cap
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Projectile.OnTriggerEnter2D 영역 동족 Projectile skip (Wall·Enemy 판정 이전).
원인: fallback Projectile GO 영역 default Layer 0 영역 → 다른 Projectile 영역 isWall=true 판정 → 양쪽 SelfDestruct.
fix: other.GetComponent<Projectile>() != null 시 즉시 return.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업 1 — 사망 모션 y -0.5 → -0.3 (EnemyDeath·PlayerDeath)
작업 2 — 게임 시작 시 파이어볼 투사체 정지·잔존 fix:
- ProjectileSpawner.Trigger — facing.sqrMagnitude < 0.01f 시 Vector2.right fallback
- 원인: Player.Facing 영역 (0,0) 영역 → _direction = (0,0) → _speed × deltaTime × (0,0) = 0 → 정지
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업 1 — A05·A_Laser 박스 SpriteRenderer.enabled 누락 정정:
- MeleeAreaSpawner·LaserSpawner 영역 직접 GO 생성·SpriteRenderer 부착 (HitboxDebug 미경유 영역).
- sr.enabled = HitboxDebug.ShowDebugVisuals 1줄 추가 (재활용 toggle 정합).
작업 2 — Player 피격 X 진단 Debug.Log 추가 (회수 의무):
- EnemyController.Update L387-396 — VisualBounds.Intersects(Player.Bounds)·IsGrounded·IsInvulnerable 측정.
- [EnemyHit][Intersect] (조건 측정)·[EnemyHit][Decrement] (실제 호출) 2종 prefix.
- PD Console 측정 후 본 PM 가설 검증·근본 fix 후 Debug.Log 회수.
- 본 PM 가설: (1) Enemy patrol 거리 영역 Player 근접 X (2) Enemy maxHearts=1 자동 공격 즉시 처치 (3) IsGrounded false 영역 통과.
feedback_pm_root_diagnosis_priority 정합 — 가설 추정 사전 진단 우선.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업 1 — 디버그 박스·사거리 박스 시각화 off (재활용 toggle):
- HitboxDebug.ShowDebugVisuals 정적 플래그 신규 (false 기본·true 설정 시 즉시 노출)
- Spawn·AttachSprite·SpawnRange·SpawnHitboxDebugChild 4 위치 SpriteRenderer.enabled 정합
- GameObject 자체는 정상 spawn → LiveHitboxSync 등 부착 코드 무영향
작업 2 — 레벨업 카드 풀 5종 한정:
- SkillRuntimeFactory.AvailableCardIds HashSet (A02·A13·A04·A05·A_Laser)
- RandomDraw3 영역 화이트리스트 필터 추가
- 미완성 placeholder (A01·A03·A08·A14·A15) 카드 풀 제외
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
원인: MeleeAreaSpawner 이펙트 spawn 후 SetParent 미적용.
spawn 시점 world 좌표에서 freeze 되어 Player 전진 시
이펙트가 뒤로 밀려 보이는 현상.
박스(판정) 는 이미 Player 자식 부착이라 동조 정상.
정정:
- fxGo.transform.SetParent(inventory.transform, true)
- worldPositionStays=true 로 spawn 직후의 world 위치·rotation·scale 유지
+ Player 이동에 자동 동조.
검증 (Play 모드):
- Player x: -7 → -5 (Δ+2.0) 이동
- FX worldPos: -6.80 → -4.80 (Δ+2.0) ✓
- BOX worldPos: -7.00 → -5.00 (Δ+2.0) ✓
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
원인: Scene Assets/Scenes/Ingame.unity 에 이전 Edit Mode 측정 잔존 spawn 6건 영구 저장
- FX_Lightningball(Clone) × 3 (각각 ProjectileHitbox_Debug × 1 자식)
- FX_SLASH(Clone) × 2
- FX_Dragonfire(Clone) × 1
정정 1: Scene 잔존 spawn 6건 일괄 삭제 + Scene 재저장 (Ingame.unity).
정정 2: 모든 runtime spawn GameObject 에 HideFlags.DontSave 부여
(HitboxDebug · Projectile · LaserSpawner · MeleeAreaSpawner ·
LightningStrikeSpawner · ProjectileSpawner · EnemyStateComponents)
→ Scene 저장 시 무시 + Play→Stop 자동 cleanup.
검증: Play 모드 1회 발사 시 박스 1개만 spawn (LaserHitbox_Debug 1·
A13 ProjectileHitbox_Debug 1) · Stop 후 Scene 잔존 0건 확인.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>