diff --git a/Assets/Scripts/Skills/Effectors/CloneInstance.cs b/Assets/Scripts/Skills/Effectors/CloneInstance.cs
index 9e31e72..85f00e1 100644
--- a/Assets/Scripts/Skills/Effectors/CloneInstance.cs
+++ b/Assets/Scripts/Skills/Effectors/CloneInstance.cs
@@ -48,6 +48,9 @@ namespace EerieVillage.Skills.Effectors
/// PD 명세 — 분신 sprite alpha (반투명).
public const float SPRITE_ALPHA = 0.5f;
+ /// PD 지시 2026-05-18 — 분신 위치 영역 영역 영역 영역 (Player facing 변경 시 자연 영역 영역·순간 이동 X·걸어서 뒤로 가는 영역).
+ public const float MOVE_SPEED = 3f;
+
// ─────────────────────────────────────────────────────────────
// Singleton (PD 결정 — 분신 1기 유지·재발동 시 기존 destroy + 새 spawn)
// ─────────────────────────────────────────────────────────────
@@ -62,11 +65,16 @@ namespace EerieVillage.Skills.Effectors
// ─────────────────────────────────────────────────────────────
private PlayerSkillInventory _playerInventory;
- // spawn 시점 Player facing.x sign (PD 결정 — 분신 facing 고정)
+ // spawn 시점 Player facing.x sign (PD 결정 — 분신 발동 facing 고정·시각 영역 영역 영역 영역)
private float _spawnFacingX;
// spawn 시각 (lifetime 자동 소멸용 · timeScale 무관 unscaledTime)
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
private readonly Queue _pendingQueue = new Queue();
@@ -118,15 +126,16 @@ namespace EerieVillage.Skills.Effectors
go.transform.localScale = playerSr != null ? playerSr.transform.localScale : Vector3.one;
go.transform.localRotation = Quaternion.identity;
+ SpriteRenderer cloneSr = null;
if (playerSr != null)
{
- var sr = go.AddComponent();
- sr.sprite = playerSr.sprite;
- sr.flipX = playerSr.flipX;
- sr.sortingOrder = playerSr.sortingOrder - 1; // Player 뒤쪽 sorting
+ cloneSr = go.AddComponent();
+ cloneSr.sprite = playerSr.sprite;
+ cloneSr.flipX = playerSr.flipX;
+ cloneSr.sortingOrder = playerSr.sortingOrder - 1; // Player 뒤쪽 sorting
Color c = playerSr.color;
- c.a = SPRITE_ALPHA; // PD 명세 — 반투명
- sr.color = c;
+ c.a = SPRITE_ALPHA; // PD 명세 — 반투명
+ cloneSr.color = c;
}
// PD 결정 — Collider 미부착 (무적·무충돌). Rigidbody2D도 미부착 (gravity·물리 차단).
@@ -136,6 +145,10 @@ namespace EerieVillage.Skills.Effectors
instance._playerInventory = playerInventory;
instance._spawnFacingX = signX;
instance._spawnTime = Time.unscaledTime;
+ // BT12-Dev-Clone (2026-05-18) — sprite 영역 + 영역 영역 영역 영역
+ instance._cloneSr = cloneSr;
+ instance._playerSr = playerSr;
+ instance._targetLocalPos = go.transform.localPosition;
_current = instance;
// 6. Player Fire 이벤트 구독
@@ -178,6 +191,9 @@ namespace EerieVillage.Skills.Effectors
return;
}
+ // BT12-Dev-Clone (2026-05-18) — 매 frame Player sprite 동기화 + 위치 영역 영역 영역
+ SyncSpriteAndPosition();
+
// 지연 큐 dequeue — TriggerTime 도달 항목 발동
while (_pendingQueue.Count > 0 && _pendingQueue.Peek().TriggerTime <= Time.unscaledTime)
{
@@ -186,6 +202,37 @@ 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();
+ 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 영역)
// ─────────────────────────────────────────────────────────────