From 5f7001a9a9d4ec5cf0f9bc973db492d33c0c786f Mon Sep 17 00:00:00 2001 From: swrring Date: Thu, 14 May 2026 23:28:13 +0900 Subject: [PATCH] =?UTF-8?q?fix(BT12-Dev):=20A11=20=EC=A0=95=EB=A0=B9?= =?UTF-8?q?=EB=B6=88=20OffsetDistance=20=EC=A0=81=EC=9A=A9=20(PD=20?= =?UTF-8?q?=EC=A7=80=EC=8B=9C=202026-05-14)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PD 보고: "정령불은 피격 범위의 offset distance가 적용되지 않고 있어" 원인: SpiritFireInstance.Update center = Player.position 그대로· 박스 시각 dbg.localPosition = zero. OffsetDistance 적용 누락. 정정 (A05·Laser 동일 패턴·signX + Vector2): 1. SpiritFireSpawner.Trigger 영역 facing sign + OffsetDistance Vector2 offset 계산 → Init 인자로 전달 (Init signature 확장). 2. SpiritFireInstance._offset 신규 필드. 3. 박스 시각 localPosition = (_offset.x / lpx, _offset.y / lpy) (Player.lossyScale 보정). 4. 판정 center = Player.position + _offset (Update 매 frame). 검증 (Play 모드): - test OffsetDistance (0, 1.5) 적용 - 박스 worldPos Δ from Player = (0, 1.50) ✓ - localPosition (0, 0.88) — Player.lossyScale.y=1.7 보정 정합 PD Inspector 실측: OffsetDistance=(0, 2)·HitboxSize=(3.4, 1.0) 정합 적용. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Skills/Effectors/SpiritFireSpawner.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) 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)