fix(BT12-Dev-Clone): 분신 동조 영역 worldPos 기반 + 영역 영역 50% 영역 (PD 지시 2026-05-18)
PD 보고 2건:
1. Player 영역 영역 → 분신 영역 영역 영역 영역 영역 → 영역 영역 영역
원인: 분신 영역 = Player root 자식 부착 영역 → Player.localScale 영역 영역 영역 영역 분신 lossyScale 영역 영역 영역 영역 영역
fix: SetParent X · 독립 GameObject + 매 frame Player worldPos + offset 영역 영역
분신 flipX = 이동 방향 영역 영역 영역 (deltaX 영역) → 자연 영역 영역
2. 영역 영역 영역 영역 영역 (영역 영역 영역 영역 영역) + 달리는 영역 영역 영역
fix: SPAWN_OFFSET_X 1.0 → 0.5 (50% 영역)
sprite 영역 매 frame 영역 (_cloneSr.sprite = _playerSr.sprite) Animator frame 영역 영역 영역
CloneInstance 정정:
- SPAWN_OFFSET_X 0.5 (50% 영역)
- SpawnOrReplace: SetParent X · transform.position = playerPos + offset · localScale = PlayerSr.lossyScale (Player 영역 동일)
- SyncSpriteAndPosition: worldPos target 영역 영역 · MoveTowards · sprite 영역 · flipX 영역 영역 영역 영역
MCP 검증: refresh_unity + read_console errors 0
This commit is contained in:
parent
c3749ddbf5
commit
081c7715e4
|
|
@ -42,8 +42,8 @@ namespace EerieVillage.Skills.Effectors
|
|||
/// <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;
|
||||
/// <summary>PD 명세 — 분신 spawn 위치 (facing 반대 방향). PD 지시 2026-05-18: 1.0 → 0.5 (50% 단축).</summary>
|
||||
public const float SPAWN_OFFSET_X = 0.5f;
|
||||
|
||||
/// <summary>PD 명세 — 분신 sprite alpha (반투명).</summary>
|
||||
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<SpriteRenderer>();
|
||||
|
||||
// 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<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);
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────
|
||||
|
|
|
|||
Loading…
Reference in New Issue