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 영역) // ─────────────────────────────────────────────────────────────