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:
parent
e2b446e0f4
commit
5f7001a9a9
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue