Compare commits

..

No commits in common. "d603e59126256a0b6da92d62aaf923f92401fc99" and "bacc76dd041f54067f08491f82747aa3c413ea81" have entirely different histories.

1 changed files with 9 additions and 56 deletions

View File

@ -39,8 +39,8 @@ namespace EerieVillage.Skills.Effectors
/// <summary>PD 결정 — 분신 자동 소멸 시간 (초). Lv 업 시 추후 증가 (balance-designer).</summary> /// <summary>PD 결정 — 분신 자동 소멸 시간 (초). Lv 업 시 추후 증가 (balance-designer).</summary>
public const float LIFETIME_SECONDS = 12f; public const float LIFETIME_SECONDS = 12f;
/// <summary>PD 명세 — 공격 시작 딜레이 (초). PD 지시 2026-05-18: 0.5 → 0.25 (50% 단축).</summary> /// <summary>PD 명세 — 공격 시작 딜레이 (초).</summary>
public const float FIRE_DELAY_SECONDS = 0.25f; public const float FIRE_DELAY_SECONDS = 0.5f;
/// <summary>PD 명세 — 분신 spawn 위치 (facing 반대 방향 1유닛).</summary> /// <summary>PD 명세 — 분신 spawn 위치 (facing 반대 방향 1유닛).</summary>
public const float SPAWN_OFFSET_X = 1f; public const float SPAWN_OFFSET_X = 1f;
@ -48,9 +48,6 @@ namespace EerieVillage.Skills.Effectors
/// <summary>PD 명세 — 분신 sprite alpha (반투명).</summary> /// <summary>PD 명세 — 분신 sprite alpha (반투명).</summary>
public const float SPRITE_ALPHA = 0.5f; public const float SPRITE_ALPHA = 0.5f;
/// <summary>PD 지시 2026-05-18 — 분신 위치 영역 영역 영역 영역 (Player facing 변경 시 자연 영역 영역·순간 이동 X·걸어서 뒤로 가는 영역).</summary>
public const float MOVE_SPEED = 3f;
// ───────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────
// Singleton (PD 결정 — 분신 1기 유지·재발동 시 기존 destroy + 새 spawn) // Singleton (PD 결정 — 분신 1기 유지·재발동 시 기존 destroy + 새 spawn)
// ───────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────
@ -65,16 +62,11 @@ namespace EerieVillage.Skills.Effectors
// ───────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────
private PlayerSkillInventory _playerInventory; private PlayerSkillInventory _playerInventory;
// spawn 시점 Player facing.x sign (PD 결정 — 분신 발동 facing 고정·시각 영역 영역 영역 영역) // spawn 시점 Player facing.x sign (PD 결정 — 분신 facing 고정)
private float _spawnFacingX; private float _spawnFacingX;
// spawn 시각 (lifetime 자동 소멸용 · timeScale 무관 unscaledTime) // spawn 시각 (lifetime 자동 소멸용 · timeScale 무관 unscaledTime)
private float _spawnTime; private float _spawnTime;
// BT12-Dev-Clone (2026-05-18) — 분신 영역 매 frame sprite 영역 + 영역 영역 영역 영역
private SpriteRenderer _cloneSr;
private SpriteRenderer _playerSr;
private Vector3 _targetLocalPos;
// 지연 큐 — Player Fire 시 0.5초 후 분신 발동 enqueue // 지연 큐 — Player Fire 시 0.5초 후 분신 발동 enqueue
private readonly Queue<PendingFire> _pendingQueue = new Queue<PendingFire>(); private readonly Queue<PendingFire> _pendingQueue = new Queue<PendingFire>();
@ -126,16 +118,15 @@ namespace EerieVillage.Skills.Effectors
go.transform.localScale = playerSr != null ? playerSr.transform.localScale : Vector3.one; go.transform.localScale = playerSr != null ? playerSr.transform.localScale : Vector3.one;
go.transform.localRotation = Quaternion.identity; go.transform.localRotation = Quaternion.identity;
SpriteRenderer cloneSr = null;
if (playerSr != null) if (playerSr != null)
{ {
cloneSr = go.AddComponent<SpriteRenderer>(); var sr = go.AddComponent<SpriteRenderer>();
cloneSr.sprite = playerSr.sprite; sr.sprite = playerSr.sprite;
cloneSr.flipX = playerSr.flipX; sr.flipX = playerSr.flipX;
cloneSr.sortingOrder = playerSr.sortingOrder - 1; // Player 뒤쪽 sorting sr.sortingOrder = playerSr.sortingOrder - 1; // Player 뒤쪽 sorting
Color c = playerSr.color; Color c = playerSr.color;
c.a = SPRITE_ALPHA; // PD 명세 — 반투명 c.a = SPRITE_ALPHA; // PD 명세 — 반투명
cloneSr.color = c; sr.color = c;
} }
// PD 결정 — Collider 미부착 (무적·무충돌). Rigidbody2D도 미부착 (gravity·물리 차단). // PD 결정 — Collider 미부착 (무적·무충돌). Rigidbody2D도 미부착 (gravity·물리 차단).
@ -145,10 +136,6 @@ namespace EerieVillage.Skills.Effectors
instance._playerInventory = playerInventory; instance._playerInventory = playerInventory;
instance._spawnFacingX = signX; instance._spawnFacingX = signX;
instance._spawnTime = Time.unscaledTime; instance._spawnTime = Time.unscaledTime;
// BT12-Dev-Clone (2026-05-18) — sprite 영역 + 영역 영역 영역 영역
instance._cloneSr = cloneSr;
instance._playerSr = playerSr;
instance._targetLocalPos = go.transform.localPosition;
_current = instance; _current = instance;
// 6. Player Fire 이벤트 구독 // 6. Player Fire 이벤트 구독
@ -191,9 +178,6 @@ namespace EerieVillage.Skills.Effectors
return; return;
} }
// BT12-Dev-Clone (2026-05-18) — 매 frame Player sprite 동기화 + 위치 영역 영역 영역
SyncSpriteAndPosition();
// 지연 큐 dequeue — TriggerTime 도달 항목 발동 // 지연 큐 dequeue — TriggerTime 도달 항목 발동
while (_pendingQueue.Count > 0 && _pendingQueue.Peek().TriggerTime <= Time.unscaledTime) while (_pendingQueue.Count > 0 && _pendingQueue.Peek().TriggerTime <= Time.unscaledTime)
{ {
@ -202,37 +186,6 @@ namespace EerieVillage.Skills.Effectors
} }
} }
// ─────────────────────────────────────────────────────────────
// BT12-Dev-Clone (2026-05-18) — 매 frame Player 동조
// ─────────────────────────────────────────────────────────────
private void SyncSpriteAndPosition()
{
if (_playerInventory == null) return;
// 1. PD 지시 2026-05-18 — sprite 영역 매 frame Player 영역 동조 (Animator frame·flipX 영역 영역)
if (_cloneSr != null && _playerSr != null)
{
_cloneSr.sprite = _playerSr.sprite;
_cloneSr.flipX = _playerSr.flipX;
}
// 2. PD 지시 2026-05-18 — Player facing 변경 시 분신 위치 영역 영역 영역 영역 (순간 이동 X·걸어서 뒤로 가는 영역)
var pc = _playerInventory.GetComponent<PlayerController>();
if (pc != null)
{
Vector2 facing = pc.Facing;
if (facing.sqrMagnitude > 0.01f)
{
float signX = facing.x < 0f ? -1f : 1f;
_targetLocalPos = new Vector3(-signX * SPAWN_OFFSET_X, 0f, 0f);
}
}
// 3. 영역 영역 영역 영역 영역 영역 영역 (MoveTowards · MOVE_SPEED 영역 영역)
transform.localPosition = Vector3.MoveTowards(transform.localPosition, _targetLocalPos, MOVE_SPEED * Time.deltaTime);
}
// ───────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────
// 분신 위치 anchor Effector 재호출 (50% damage 분기는 PlayerSkillInventory.IsCloneFireActive 영역) // 분신 위치 anchor Effector 재호출 (50% damage 분기는 PlayerSkillInventory.IsCloneFireActive 영역)
// ───────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────