From 705d943e38b68da90e93ff3bb51f1d0f131415ab Mon Sep 17 00:00:00 2001 From: swrring Date: Wed, 13 May 2026 20:21:25 +0900 Subject: [PATCH] =?UTF-8?q?fix(BT12-Dev):=20Projectile=20unscaledTime=20?= =?UTF-8?q?=E2=80=94=20Time.timeScale=3D0=20=EC=98=81=EC=97=AD=20=EC=98=81?= =?UTF-8?q?=EA=B5=AC=20=EC=9E=94=EC=A1=B4=20=EC=B0=A8=EB=8B=A8=20(PD=20?= =?UTF-8?q?=EC=A7=80=EC=8B=9C=202026-05-13)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 근본 원인: - 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) --- Assets/Scripts/Skills/Effectors/Projectile.cs | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Assets/Scripts/Skills/Effectors/Projectile.cs b/Assets/Scripts/Skills/Effectors/Projectile.cs index 3c0682d..a5796c1 100644 --- a/Assets/Scripts/Skills/Effectors/Projectile.cs +++ b/Assets/Scripts/Skills/Effectors/Projectile.cs @@ -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 영역) 영역 영역