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; } // ─────────────────────────────────────────────────────────────