EerieVillage/Assets/Scripts/Skills/Effectors/LiveHitboxSync.cs

69 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}