fix(BT12-Dev): Projectile unscaledTime — Time.timeScale=0 영역 영구 잔존 차단 (PD 지시 2026-05-13)

근본 원인:
- 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>
This commit is contained in:
깃 관리자 2026-05-13 20:21:25 +09:00
parent b1931afa15
commit 705d943e38
1 changed files with 11 additions and 9 deletions

View File

@ -53,7 +53,8 @@ namespace EerieVillage.Skills.Effectors
// BT12-Dev 2026-05-10 (PD #1) — 거리 제한 영역 영역 spawn 위치 저장
_spawnPosition = transform.position;
_spawnTime = Time.time;
// PD 지시 2026-05-13 — Time.timeScale=0 (LevelUp 카드 선택) 영역 Time.time 정지 → unscaledTime 영역 lifetime check 정합
_spawnTime = Time.unscaledTime;
// PD 지시 2026-05-13 — 투사체 사정거리·속도 Inspector 직접 조절 (RangeTier·camWidth·mults 계산 폐기)
_maxRange = (_data.MaxRange > 0.01f) ? _data.MaxRange : 10f;
@ -84,11 +85,12 @@ namespace EerieVillage.Skills.Effectors
else _baseAlphas[i] = 1f;
}
// Phase 2-B: 풀링 미도입 — Invoke 기반 자동 소멸 (거리 제한 영역 영역 영역 영역 영역 안전망)
Invoke(nameof(SelfDestruct), _lifetime);
// PD 지시 2026-05-13 — Invoke 폐기 (Time.timeScale=0 영역 호출 X·영구 잔존 원인)·unscaledTime backup 영역 lifetime 영역 보장
// CancelInvoke 호출 영역 추가 안전 (이전 영역 영역 Invoke 영역 잔존 차단)
CancelInvoke();
// PD 지시 2026-05-13 — 진단 (회수 의무·잔존 추적)
Debug.Log($"[Projectile][Initialize] name={name} dir=({_direction.x:F2},{_direction.y:F2}) speed={_speed:F2} maxRange={_maxRange:F2} lifetime={_lifetime:F2} t={Time.time:F2}");
Debug.Log($"[Projectile][Initialize] name={name} dir=({_direction.x:F2},{_direction.y:F2}) speed={_speed:F2} maxRange={_maxRange:F2} lifetime={_lifetime:F2} t={Time.unscaledTime:F2}");
}
// BT12-Dev 2026-05-13 — 사거리 80~100% 영역 scale·alpha 보간 (PD 지시)
@ -134,10 +136,10 @@ namespace EerieVillage.Skills.Effectors
return;
}
// PD 지시 2026-05-13 — Invoke 영역 호출 X 영역 영역 안전망 (lifetime + 0.5초 영역 영역 강제 SelfDestruct)
if (_spawnTime > 0f && Time.time - _spawnTime > _lifetime + 0.5f)
// PD 지시 2026-05-13 — unscaledTime 영역 lifetime check (Time.timeScale=0 영역 Time.time 정지 영역 회피·재시작 시 영구 잔존 차단)
if (_spawnTime > 0f && Time.unscaledTime - _spawnTime > _lifetime)
{
Debug.Log($"[Projectile][LifetimeForce] name={name} spawn={_spawnTime:F2} now={Time.time:F2} lifetime={_lifetime:F2}");
Debug.Log($"[Projectile][LifetimeForce] name={name} spawn={_spawnTime:F2} now={Time.unscaledTime:F2} lifetime={_lifetime:F2}");
SelfDestruct();
return;
}
@ -162,8 +164,8 @@ namespace EerieVillage.Skills.Effectors
}
// BT12-Dev 2026-05-10 (PD #2 fix·재발 정정 #2) — Wall OverlapPoint·useTriggers=false (CinemachineConfiner Trigger 영역 영역 영역).
// grace period 0.05s 영역 spawn 시점 즉시 SelfDestruct 회피.
if (Time.time - _spawnTime > 0.05f)
// grace period 0.05s 영역 spawn 시점 즉시 SelfDestruct 회피·PD 지시 2026-05-13 unscaledTime 정합.
if (Time.unscaledTime - _spawnTime > 0.05f)
{
var filter = new ContactFilter2D();
filter.useTriggers = false; // Trigger collider (CinemachineConfiner 영역) 영역 영역