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