fix(BT12-Dev): fx ParticleSystem.scalingMode = Hierarchy 전수 적용 (PD 지시 2026-05-13)

원인: 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>
This commit is contained in:
깃 관리자 2026-05-13 23:58:39 +09:00
parent eab215db65
commit 6ed6efe6a2
7 changed files with 10 additions and 7 deletions

View File

@ -40,7 +40,7 @@ namespace EerieVillage.Skills.Effectors
fx.transform.SetParent(inventory.transform, true); fx.transform.SetParent(inventory.transform, true);
fx.transform.localScale *= data.HitFxScale; fx.transform.localScale *= data.HitFxScale;
// PD 지시 2026-05-13 — ParticleSystem 명시 Play // PD 지시 2026-05-13 — ParticleSystem 명시 Play
foreach (var ps in fx.GetComponentsInChildren<ParticleSystem>(true)) ps.Play(true); foreach (var ps in fx.GetComponentsInChildren<ParticleSystem>(true)) { var m = ps.main; m.scalingMode = ParticleSystemScalingMode.Hierarchy; ps.Play(true); }
} }
float fxLifetime = GetFxLifetime(fx); float fxLifetime = GetFxLifetime(fx);

View File

@ -66,7 +66,7 @@ namespace EerieVillage.Skills.Effectors
fx.hideFlags = HideFlags.DontSave; // PD 지시 2026-05-13 — Scene 저장 회피 fx.hideFlags = HideFlags.DontSave; // PD 지시 2026-05-13 — Scene 저장 회피
fx.transform.localScale *= data.HitFxScale; fx.transform.localScale *= data.HitFxScale;
// PD 지시 2026-05-13 — ParticleSystem 명시 Play // PD 지시 2026-05-13 — ParticleSystem 명시 Play
foreach (var ps in fx.GetComponentsInChildren<ParticleSystem>(true)) ps.Play(true); foreach (var ps in fx.GetComponentsInChildren<ParticleSystem>(true)) { var m = ps.main; m.scalingMode = ParticleSystemScalingMode.Hierarchy; ps.Play(true); }
fxTotalLifetime = GetFxLifetime(fx); fxTotalLifetime = GetFxLifetime(fx);
AutoDestroyFx(fx, fxTotalLifetime); AutoDestroyFx(fx, fxTotalLifetime);
} }
@ -116,7 +116,7 @@ namespace EerieVillage.Skills.Effectors
extraFx.hideFlags = HideFlags.DontSave; extraFx.hideFlags = HideFlags.DontSave;
extraFx.transform.localScale *= data.HitFxScale; extraFx.transform.localScale *= data.HitFxScale;
// PD 지시 2026-05-13 — ParticleSystem 명시 Play // PD 지시 2026-05-13 — ParticleSystem 명시 Play
foreach (var ps in extraFx.GetComponentsInChildren<ParticleSystem>(true)) ps.Play(true); foreach (var ps in extraFx.GetComponentsInChildren<ParticleSystem>(true)) { var m = ps.main; m.scalingMode = ParticleSystemScalingMode.Hierarchy; ps.Play(true); }
AutoDestroyFx(extraFx, GetFxLifetime(extraFx)); AutoDestroyFx(extraFx, GetFxLifetime(extraFx));
} }

View File

@ -41,7 +41,7 @@ namespace EerieVillage.Skills.Effectors
// Player 자식 부착 (worldPositionStays=true) 으로 spawn 후에도 Player 이동에 동조. // Player 자식 부착 (worldPositionStays=true) 으로 spawn 후에도 Player 이동에 동조.
fxGo.transform.SetParent(inventory.transform, true); fxGo.transform.SetParent(inventory.transform, true);
// PD 지시 2026-05-13 — ParticleSystem 명시 Play // PD 지시 2026-05-13 — ParticleSystem 명시 Play
foreach (var ps in fxGo.GetComponentsInChildren<ParticleSystem>(true)) ps.Play(true); foreach (var ps in fxGo.GetComponentsInChildren<ParticleSystem>(true)) { var m = ps.main; m.scalingMode = ParticleSystemScalingMode.Hierarchy; ps.Play(true); }
fxLifetime = GetFxLifetime(fxGo); fxLifetime = GetFxLifetime(fxGo);
// PD 지시 2026-05-13 — unscaledTime cap (Time.timeScale=0 영역 잔존 차단) // PD 지시 2026-05-13 — unscaledTime cap (Time.timeScale=0 영역 잔존 차단)
FxAutoDestroyUnscaled.Attach(fxGo, Mathf.Min(fxLifetime + 0.2f, 5f)); FxAutoDestroyUnscaled.Attach(fxGo, Mathf.Min(fxLifetime + 0.2f, 5f));

View File

@ -53,6 +53,7 @@ namespace EerieVillage.Skills.Effectors
// PD 지시 2026-05-13 — ParticleSystem 명시 Play (playOnAwake 영역 정합·재발 안전망) // PD 지시 2026-05-13 — ParticleSystem 명시 Play (playOnAwake 영역 정합·재발 안전망)
foreach (var ps in swampGo.GetComponentsInChildren<ParticleSystem>(true)) foreach (var ps in swampGo.GetComponentsInChildren<ParticleSystem>(true))
{ {
var m = ps.main; m.scalingMode = ParticleSystemScalingMode.Hierarchy;
ps.Play(true); ps.Play(true);
} }
} }
@ -178,6 +179,7 @@ namespace EerieVillage.Skills.Effectors
// PD 지시 2026-05-13 — ParticleSystem 명시 Play (playOnAwake 영역 정합·재발 안전망) // PD 지시 2026-05-13 — ParticleSystem 명시 Play (playOnAwake 영역 정합·재발 안전망)
foreach (var ps in fx.GetComponentsInChildren<ParticleSystem>(true)) foreach (var ps in fx.GetComponentsInChildren<ParticleSystem>(true))
{ {
var m = ps.main; m.scalingMode = ParticleSystemScalingMode.Hierarchy;
ps.Play(true); ps.Play(true);
} }
FxAutoDestroyUnscaled.Attach(fx, 1.5f); FxAutoDestroyUnscaled.Attach(fx, 1.5f);

View File

@ -220,7 +220,7 @@ namespace EerieVillage.Skills.Effectors
fx.hideFlags = HideFlags.DontSave; // PD 지시 2026-05-13 — Scene 저장 회피 fx.hideFlags = HideFlags.DontSave; // PD 지시 2026-05-13 — Scene 저장 회피
fx.transform.localScale *= _data.HitFxScale; fx.transform.localScale *= _data.HitFxScale;
// PD 지시 2026-05-13 — ParticleSystem 명시 Play // PD 지시 2026-05-13 — ParticleSystem 명시 Play
foreach (var ps in fx.GetComponentsInChildren<ParticleSystem>(true)) ps.Play(true); foreach (var ps in fx.GetComponentsInChildren<ParticleSystem>(true)) { var m = ps.main; m.scalingMode = ParticleSystemScalingMode.Hierarchy; ps.Play(true); }
AutoDestroyOnParticleEnd(fx); AutoDestroyOnParticleEnd(fx);
} }

View File

@ -43,7 +43,7 @@ namespace EerieVillage.Skills.Effectors
var castFx = Object.Instantiate(data.CastFxPrefab, playerTransform.position, Quaternion.Euler(0f, 0f, castAngle)); var castFx = Object.Instantiate(data.CastFxPrefab, playerTransform.position, Quaternion.Euler(0f, 0f, castAngle));
castFx.hideFlags = HideFlags.DontSave; castFx.hideFlags = HideFlags.DontSave;
castFx.transform.localScale *= data.HitFxScale; castFx.transform.localScale *= data.HitFxScale;
foreach (var ps in castFx.GetComponentsInChildren<ParticleSystem>(true)) ps.Play(true); foreach (var ps in castFx.GetComponentsInChildren<ParticleSystem>(true)) { var m = ps.main; m.scalingMode = ParticleSystemScalingMode.Hierarchy; ps.Play(true); }
FxAutoDestroyUnscaled.Attach(castFx, 2f); FxAutoDestroyUnscaled.Attach(castFx, 2f);
} }
@ -69,7 +69,7 @@ namespace EerieVillage.Skills.Effectors
// PD 지시 2026-05-13 — 런타임 spawn 투사체 Scene 저장 회피 (Edit Mode execute 시 잔존 방지) // PD 지시 2026-05-13 — 런타임 spawn 투사체 Scene 저장 회피 (Edit Mode execute 시 잔존 방지)
go.hideFlags = HideFlags.DontSave; go.hideFlags = HideFlags.DontSave;
// PD 지시 2026-05-13 — ParticleSystem 명시 Play (ProjectilePrefab 영역 자체 FX·A08 FX_PinkMagicArrow 등) // PD 지시 2026-05-13 — ParticleSystem 명시 Play (ProjectilePrefab 영역 자체 FX·A08 FX_PinkMagicArrow 등)
foreach (var ps in go.GetComponentsInChildren<ParticleSystem>(true)) ps.Play(true); foreach (var ps in go.GetComponentsInChildren<ParticleSystem>(true)) { var m = ps.main; m.scalingMode = ParticleSystemScalingMode.Hierarchy; ps.Play(true); }
// PD 지시 2026-05-13 — 시각화 ↔ 판정 정합 — BoxCollider2D size = HitboxSize·isTrigger=true. // PD 지시 2026-05-13 — 시각화 ↔ 판정 정합 — BoxCollider2D size = HitboxSize·isTrigger=true.
// FX prefab 영역 기존 Collider2D 있으면 size 만 정합·없으면 신규 BoxCollider2D 부착. // FX prefab 영역 기존 Collider2D 있으면 size 만 정합·없으면 신규 BoxCollider2D 부착.

View File

@ -27,6 +27,7 @@ namespace EerieVillage.Skills.Effectors
// PD 지시 2026-05-13 — ParticleSystem 명시 Play (playOnAwake 영역 정합·재발 안전망) // PD 지시 2026-05-13 — ParticleSystem 명시 Play (playOnAwake 영역 정합·재발 안전망)
foreach (var ps in shieldGo.GetComponentsInChildren<ParticleSystem>(true)) foreach (var ps in shieldGo.GetComponentsInChildren<ParticleSystem>(true))
{ {
var m = ps.main; m.scalingMode = ParticleSystemScalingMode.Hierarchy;
ps.Play(true); ps.Play(true);
} }
} }