diff --git a/Assets/Scripts/Skills/Effectors/CloneInstance.cs b/Assets/Scripts/Skills/Effectors/CloneInstance.cs
index afb749a..1bf4ff7 100644
--- a/Assets/Scripts/Skills/Effectors/CloneInstance.cs
+++ b/Assets/Scripts/Skills/Effectors/CloneInstance.cs
@@ -42,8 +42,8 @@ namespace EerieVillage.Skills.Effectors
/// PD 명세 — 공격 시작 딜레이 (초). PD 지시 2026-05-18: 0.5 → 0.25 (50% 단축).
public const float FIRE_DELAY_SECONDS = 0.25f;
- /// PD 명세 — 분신 spawn 위치 (facing 반대 방향 1유닛).
- public const float SPAWN_OFFSET_X = 1f;
+ /// PD 명세 — 분신 spawn 위치 (facing 반대 방향). PD 지시 2026-05-18: 1.0 → 0.5 (50% 단축).
+ public const float SPAWN_OFFSET_X = 0.5f;
/// PD 명세 — 분신 sprite alpha (반투명).
public const float SPRITE_ALPHA = 0.5f;
@@ -113,33 +113,18 @@ namespace EerieVillage.Skills.Effectors
Vector2 spawnPos = playerPos + new Vector2(-signX * SPAWN_OFFSET_X, 0f);
// 4. 신규 GameObject — sprite 복제 + alpha 0.5 + collider 미부착 (무적)
- // PD 지시 2026-05-18: Player 자식 부착 (Player 이동 시 분신 자동 동조) + scale 영역 Player 동일 (크기 정합)
+ // PD 지시 2026-05-18: SetParent X · 독립 GameObject (Player 영역 영역 영역 영역 영역 X)
+ // 영역 영역 영역 = 매 frame Player worldPos + offset 영역 영역 (SyncSpriteAndPosition).
var go = new GameObject("Clone_A10");
go.hideFlags = HideFlags.DontSave; // Scene 오염 방지 (BT12-Dev SOT 정합)
var playerSr = playerInventory.GetComponentInChildren();
- // Player 자식 부착 (worldPositionStays=false) + localPosition 영역 facing 반대 1유닛
- go.transform.SetParent(playerInventory.transform, false);
- go.transform.localPosition = new Vector3(-signX * SPAWN_OFFSET_X, 0f, 0f);
- // PD 지시 2026-05-18 — 분신 크기 = Player 동일.
- // PlayerSr 영역 자식 구조 영역 영역 영역 영역 — PlayerSr.lossyScale 영역 동일 영역 영역 localScale 영역 정정.
- // 분신 lossyScale = playerInventory.lossyScale * localScale → PlayerSr.lossyScale 동일 영역 = srLossy / playerInvLossy.
- if (playerSr != null)
- {
- Vector3 playerInvLossy = playerInventory.transform.lossyScale;
- Vector3 srLossy = playerSr.transform.lossyScale;
- go.transform.localScale = new Vector3(
- Mathf.Abs(playerInvLossy.x) > 0.0001f ? srLossy.x / playerInvLossy.x : 1f,
- Mathf.Abs(playerInvLossy.y) > 0.0001f ? srLossy.y / playerInvLossy.y : 1f,
- Mathf.Abs(playerInvLossy.z) > 0.0001f ? srLossy.z / playerInvLossy.z : 1f
- );
- }
- else
- {
- go.transform.localScale = Vector3.one;
- }
- go.transform.localRotation = Quaternion.identity;
+ // SetParent X · 독립 GameObject (Player.localScale 영역 영역 영역 영역 영역 영역 분신 영역 영역 영역 영역)
+ go.transform.position = playerPos + new Vector2(-signX * SPAWN_OFFSET_X, 0f);
+ // PD 지시 2026-05-18 — 분신 크기 = Player 동일 (PlayerSr lossyScale 영역 동일·SetParent X 영역 lossyScale = localScale).
+ go.transform.localScale = playerSr != null ? playerSr.transform.lossyScale : Vector3.one;
+ go.transform.rotation = Quaternion.identity;
SpriteRenderer cloneSr = null;
if (playerSr != null)
@@ -160,10 +145,10 @@ namespace EerieVillage.Skills.Effectors
instance._playerInventory = playerInventory;
instance._spawnFacingX = signX;
instance._spawnTime = Time.unscaledTime;
- // BT12-Dev-Clone (2026-05-18) — sprite 영역 + 영역 영역 영역 영역
+ // BT12-Dev-Clone (2026-05-18) — sprite 영역 + 영역 영역 영역 영역 (worldPos 기반)
instance._cloneSr = cloneSr;
instance._playerSr = playerSr;
- instance._targetLocalPos = go.transform.localPosition;
+ instance._targetLocalPos = go.transform.position; // worldPos 영역 영역
_current = instance;
// 6. Player Fire 이벤트 구독
@@ -225,47 +210,44 @@ namespace EerieVillage.Skills.Effectors
{
if (_playerInventory == null) return;
- // 1. PD 지시 2026-05-18 — sprite 영역 매 frame Player 영역 동조 (Animator frame 영역).
- // flipX 영역 영역 영역 영역 영역 — 이동 방향 영역 영역 영역 영역.
+ // 1. PD 지시 2026-05-18 — sprite 영역 매 frame Player 영역 동조 (Animator frame 영역·달리는 영역 영역 영역 영역).
if (_cloneSr != null && _playerSr != null)
{
_cloneSr.sprite = _playerSr.sprite;
}
- // 2. 목표 위치 영역 (Player facing 영역 영역 영역)
+ // 2. PD 지시 2026-05-18 — 목표 위치 영역 = Player worldPos + facing 반대 0.5 영역 (50% 영역)
+ // SetParent X · 독립 GameObject 영역 — Player.localScale 영역 영역 영역 영역 영역 영역 영역.
+ Vector3 playerWorldPos = _playerInventory.transform.position;
+ float signX = 1f;
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);
- }
+ signX = facing.x < 0f ? -1f : 1f;
}
+ _targetLocalPos = playerWorldPos + new Vector3(-signX * SPAWN_OFFSET_X, 0f, 0f); // worldPos target
- // 3. 영역 영역 영역 영역 영역 영역 영역 (MoveTowards · MOVE_SPEED 영역 영역)
- Vector3 currentLocalPos = transform.localPosition;
- Vector3 newLocalPos = Vector3.MoveTowards(currentLocalPos, _targetLocalPos, MOVE_SPEED * Time.deltaTime);
+ // 3. 영역 영역 영역 영역 영역 영역 영역 (MoveTowards · worldPos 기반)
+ Vector3 currentPos = transform.position;
+ Vector3 newPos = Vector3.MoveTowards(currentPos, _targetLocalPos, MOVE_SPEED * Time.deltaTime);
- // 4. PD 지시 2026-05-18 — 분신 영역 영역 영역 영역 영역 영역 영역 영역 (영역 영역 X)
- // deltaX > 0 → 영역 영역 영역 → flipX = false (영역 sprite 영역 영역)
- // deltaX < 0 → 영역 영역 영역 → flipX = true
- // 영역 영역 영역 영역 영역 → Player flipX 영역 영역 (대기 영역)
+ // 4. PD 지시 2026-05-18 — 분신 영역 영역 영역 영역 영역 영역 영역 영역 (영역 영역 X·자연 영역 영역)
if (_cloneSr != null)
{
- float deltaX = newLocalPos.x - currentLocalPos.x;
+ float deltaX = newPos.x - currentPos.x;
if (Mathf.Abs(deltaX) > 0.0001f)
{
- _cloneSr.flipX = deltaX < 0f;
+ _cloneSr.flipX = deltaX < 0f; // 영역 영역 → false (영역) · 영역 영역 → true (영역)
}
else if (_playerSr != null)
{
- _cloneSr.flipX = _playerSr.flipX;
+ _cloneSr.flipX = _playerSr.flipX; // 대기 영역 영역 Player 영역 영역 영역
}
}
- transform.localPosition = newLocalPos;
+ transform.position = newPos;
}
// ─────────────────────────────────────────────────────────────