Compare commits

...

2 Commits

Author SHA1 Message Date
깃 관리자 d603e59126 tweak(BT12-Dev-Clone): 분신 공격 딜레이 0.5 → 0.25 (50% 단축·PD 지시 2026-05-18)
FIRE_DELAY_SECONDS = 0.5f → 0.25f
- PD 명세 5번 원본 (0.5초) → PD 본 영역 영역 영역 0.25초 단축
- 분신 영역 Player 영역 영역 영역 더 빠른 영역 동일 스킬 미러링

MCP 검증: refresh_unity + read_console errors 0
2026-05-18 19:13:30 +09:00
깃 관리자 b9c17e9ab5 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 통과)
2026-05-18 19:05:57 +09:00
1 changed files with 56 additions and 9 deletions

View File

@ -39,8 +39,8 @@ namespace EerieVillage.Skills.Effectors
/// <summary>PD 결정 — 분신 자동 소멸 시간 (초). Lv 업 시 추후 증가 (balance-designer).</summary>
public const float LIFETIME_SECONDS = 12f;
/// <summary>PD 명세 — 공격 시작 딜레이 (초).</summary>
public const float FIRE_DELAY_SECONDS = 0.5f;
/// <summary>PD 명세 — 공격 시작 딜레이 (초). PD 지시 2026-05-18: 0.5 → 0.25 (50% 단축).</summary>
public const float FIRE_DELAY_SECONDS = 0.25f;
/// <summary>PD 명세 — 분신 spawn 위치 (facing 반대 방향 1유닛).</summary>
public const float SPAWN_OFFSET_X = 1f;
@ -48,6 +48,9 @@ namespace EerieVillage.Skills.Effectors
/// <summary>PD 명세 — 분신 sprite alpha (반투명).</summary>
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)
// ─────────────────────────────────────────────────────────────
@ -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<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.localRotation = Quaternion.identity;
SpriteRenderer cloneSr = null;
if (playerSr != null)
{
var sr = go.AddComponent<SpriteRenderer>();
sr.sprite = playerSr.sprite;
sr.flipX = playerSr.flipX;
sr.sortingOrder = playerSr.sortingOrder - 1; // Player 뒤쪽 sorting
cloneSr = go.AddComponent<SpriteRenderer>();
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;
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<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 영역)
// ─────────────────────────────────────────────────────────────