fix(BT12-Dev): A11 정령불 OffsetDistance 적용 (PD 지시 2026-05-14)

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) <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-05-14 23:28:13 +09:00
parent e2b446e0f4
commit 5f7001a9a9
1 changed files with 15 additions and 4 deletions

View File

@ -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<PlayerController>();
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<SpiritFireInstance>();
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<Animator>();
@ -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<SpriteRenderer>();
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)