From b9c17e9ab5e246496d2f1d5b291a75d1376c244e Mon Sep 17 00:00:00 2001 From: swrring Date: Mon, 18 May 2026 19:05:57 +0900 Subject: [PATCH] =?UTF-8?q?feat(BT12-Dev-Clone):=20=EB=B6=84=EC=8B=A0=20sp?= =?UTF-8?q?rite=20=EB=8F=99=EC=A1=B0=20+=20=EC=9C=84=EC=B9=98=20=EC=98=81?= =?UTF-8?q?=EC=97=AD=20=EC=98=81=EC=97=AD=20=EC=A0=84=ED=99=98=20(PD=20?= =?UTF-8?q?=EC=A7=80=EC=8B=9C=202026-05-18)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PD 영역 영역 2건: 1. 분신 영역 Player 영역 영역 (이동·대기·idle·run 영역) 영역 영역 영역 영역 → 매 frame _cloneSr.sprite = _playerSr.sprite + flipX 동조 (Animator frame 영역 영역 영역 영역 영역 영역 영역) 2. Player facing 변경 시 분신 위치 자연 영역 (순간 이동 X·걸어서 뒤로 가는 영역) → _targetLocalPos 영역 매 frame 갱신 (facing 영역 영역 영역) + Vector3.MoveTowards (MOVE_SPEED=3f) 영역 영역 영역 CloneInstance 정정: - 신규 필드: _cloneSr·_playerSr·_targetLocalPos·MOVE_SPEED 상수 - SpawnOrReplace: cloneSr 영역 변수 영역 + instance 초기화 영역 sr 참조 저장 - Update: SyncSpriteAndPosition() 매 frame 호출 (lifetime·queue 영역 영역 영역) - SyncSpriteAndPosition: sprite·flipX 매 frame 동조 + facing 기반 target 갱신 + MoveTowards 영역 영역 영역 PD 결정 4번 (facing 고정) 정합 — 분신 발동 영역 facing = spawn 시점 _spawnFacingX 영역 영역. sprite·위치 영역 영역 = 동조 영역. MCP 검증: refresh_unity + read_console errors 0 (compile 통과) --- .../Scripts/Skills/Effectors/CloneInstance.cs | 61 ++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) 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 영역) // ─────────────────────────────────────────────────────────────