69 lines
2.9 KiB
C#
69 lines
2.9 KiB
C#
using UnityEngine;
|
||
using Platformer.Mechanics;
|
||
|
||
namespace EerieVillage.Skills.Effectors
|
||
{
|
||
/// <summary>
|
||
/// PD 지시 2026-05-13 — Inspector 영역 ActiveSkillData 값 변경 시 살아있는 시각화 박스도 즉시 반영.
|
||
/// LateUpdate 매 frame data 정합 갱신: position·rotation·localScale.
|
||
/// </summary>
|
||
public class LiveHitboxSync : MonoBehaviour
|
||
{
|
||
public enum FollowMode
|
||
{
|
||
/// <summary>Anchor + (0, OffsetDistance) + OffsetXY · size=HitboxSize · rot=FxRotation (A05 MeleeArea)</summary>
|
||
AnchorYOffset,
|
||
/// <summary>Anchor (Enemy) + (0, OffsetDistance) + OffsetXY · size=HitboxSize · rot=FxRotation (A04 Lightning·primary 사망 시 마지막 위치 유지)</summary>
|
||
EnemyAnchoredAtStrike,
|
||
/// <summary>Anchor (Player) + facing × (OffsetDistance + length/2) + OffsetXY · size=(length, width) · rot=facing+FxRotation (A_Laser)</summary>
|
||
PlayerFacingLaser,
|
||
}
|
||
|
||
public ActiveSkillData Data;
|
||
public Transform Anchor;
|
||
public FollowMode Mode;
|
||
// PlayerFacingLaser 영역 영역 — Anchor (Player) 영역 PlayerController.Facing 영역 영역
|
||
public PlayerController PlayerCtrl;
|
||
// EnemyAnchoredAtStrike — Anchor (primary enemy) 사망 시 마지막 위치 캐싱
|
||
Vector2 _lastAnchorPos;
|
||
bool _hasLastPos;
|
||
|
||
void LateUpdate()
|
||
{
|
||
if (Data == null) return;
|
||
|
||
Vector2 anchorPos;
|
||
if (Anchor != null) { anchorPos = Anchor.position; _lastAnchorPos = anchorPos; _hasLastPos = true; }
|
||
else if (_hasLastPos) anchorPos = _lastAnchorPos;
|
||
else return;
|
||
|
||
Vector2 pos = anchorPos;
|
||
float angle = 0f;
|
||
Vector3 scale = transform.localScale;
|
||
|
||
switch (Mode)
|
||
{
|
||
case FollowMode.AnchorYOffset:
|
||
case FollowMode.EnemyAnchoredAtStrike:
|
||
pos += Data.OffsetDistance + Data.OffsetXY;
|
||
angle = Data.FxRotation;
|
||
scale = new Vector3(Data.HitboxSize.x, Data.HitboxSize.y, 1f);
|
||
break;
|
||
case FollowMode.PlayerFacingLaser:
|
||
Vector2 facing = (PlayerCtrl != null) ? PlayerCtrl.Facing : Vector2.right;
|
||
facing = facing.normalized;
|
||
float length = Mathf.Max(Data.HitboxSize.x, 1f);
|
||
float width = Mathf.Max(Data.HitboxSize.y, 0.5f);
|
||
pos += Data.OffsetDistance + Data.OffsetXY + facing * (length * 0.5f);
|
||
angle = Mathf.Atan2(facing.y, facing.x) * Mathf.Rad2Deg + Data.FxRotation;
|
||
scale = new Vector3(length, width, 1f);
|
||
break;
|
||
}
|
||
|
||
transform.position = pos;
|
||
transform.rotation = Quaternion.Euler(0f, 0f, angle);
|
||
transform.localScale = scale;
|
||
}
|
||
}
|
||
}
|