diff --git a/Assets/Scripts/Skills/Effectors/SpiritFireSpawner.cs b/Assets/Scripts/Skills/Effectors/SpiritFireSpawner.cs index 829319a..21f16d1 100644 --- a/Assets/Scripts/Skills/Effectors/SpiritFireSpawner.cs +++ b/Assets/Scripts/Skills/Effectors/SpiritFireSpawner.cs @@ -44,9 +44,15 @@ namespace EerieVillage.Skills.Effectors int damage = data.BaseDamage > 0 ? data.BaseDamage : 5; // PD 지시 2026-05-14 — 일정 피해 간격 (DotInterval 우선·기본 1초) float interval = data.DotInterval > 0.01f ? data.DotInterval : 1f; + // PD 지시 2026-05-14 — OffsetDistance 적용 (facing sign · A05·Laser 동일 패턴) + Vector2 facing = Vector2.right; + var pc = inventory.GetComponent(); + if (pc != null) facing = pc.Facing; + float signX = facing.x < 0f ? -1f : 1f; + Vector2 offset = new Vector2(signX * data.OffsetDistance.x, data.OffsetDistance.y); var instance = shieldGo.AddComponent(); - instance.Init(inventory.transform, duration, boxSize, damage, interval); + instance.Init(inventory.transform, duration, boxSize, damage, interval, offset); } } @@ -68,6 +74,7 @@ namespace EerieVillage.Skills.Effectors float _spawnTime; float _duration; Vector2 _boxSize; + Vector2 _offset; // PD 지시 2026-05-14 — OffsetDistance (facing sign 적용 후·Player 기준) int _damage; float _interval; float _lastDamageTime; @@ -80,13 +87,14 @@ namespace EerieVillage.Skills.Effectors MaterialPropertyBlock _mpb; float[] _baseAlphas; - public void Init(Transform player, float duration, Vector2 boxSize, int damage, float interval) + public void Init(Transform player, float duration, Vector2 boxSize, int damage, float interval, Vector2 offset) { _player = player; _duration = duration; _boxSize = boxSize; _damage = damage; _interval = interval; + _offset = offset; _spawnTime = Time.unscaledTime; _animator = GetComponent(); @@ -98,12 +106,13 @@ namespace EerieVillage.Skills.Effectors } // PD 지시 2026-05-14 — 판정 박스 시각화 (붉은 반투명 박스·ShowDebugVisuals 토글) + // PD 지시 2026-05-14 — OffsetDistance 영역 박스 localPosition 적용 (facing sign 영역 Spawner 영역 사전 처리) var dbg = new GameObject("SpiritFireHitbox_Debug"); dbg.hideFlags = HideFlags.DontSave; dbg.transform.SetParent(_player, false); // Player 자식·매 frame 동조 - dbg.transform.localPosition = Vector3.zero; float lpx = _player.lossyScale.x != 0f ? Mathf.Abs(_player.lossyScale.x) : 1f; float lpy = _player.lossyScale.y != 0f ? Mathf.Abs(_player.lossyScale.y) : 1f; + dbg.transform.localPosition = new Vector3(_offset.x / lpx, _offset.y / lpy, 0f); dbg.transform.localScale = new Vector3(_boxSize.x / lpx, _boxSize.y / lpy, 1f); var sr = dbg.AddComponent(); sr.sprite = HitboxDebug.GetWhiteSprite(); @@ -192,7 +201,9 @@ namespace EerieVillage.Skills.Effectors return; } - Vector2 center = _player != null ? (Vector2)_player.position : (Vector2)transform.position; + // PD 지시 2026-05-14 — 판정 center = Player 위치 + OffsetDistance (박스 시각 ↔ 판정 일관) + Vector2 basePos = _player != null ? (Vector2)_player.position : (Vector2)transform.position; + Vector2 center = basePos + _offset; // PD 지시 2026-05-14 — 정령불의 범위에 있는 적은 지속 시간 동안 일정한 피해 간격마다 피해 if (Time.unscaledTime - _lastDamageTime >= _interval)