2026-05-20 적 경직추가

This commit is contained in:
2026-05-20 14:56:11 +09:00
parent e7c1330754
commit 08cdab421d
10 changed files with 113 additions and 31 deletions

View File

@@ -68,6 +68,7 @@ public class ActionData : ScriptableObject
// ─── 피격자 반응 (피격된 적의 동작) ─────────────────────────────────
[Header("Hit Reaction")]
public Vector2 HitVelocity = Vector2.zero; // 적에게 가할 넉백 속도 (X는 공격자 facing 방향)
public float HitStunDuration = 0.25f; // 피격자가 이동/공격을 못 하는 경직 시간
public bool UseHitPositionCorrection; // 적의 위치를 강제로 보정할지 (잡기/연계 안정성)
public Vector2 HitTargetOffset = new Vector2(0.8f, 0f); // 보정 시 공격자 기준 적의 목표 위치
public float HitPositionCorrectionDuration = 0.08f; // 보정 보간 시간 (0이면 즉시 텔레포트)

View File

@@ -35,6 +35,7 @@ public class AttackHitbox : MonoBehaviour
private bool _correctHitTargetY; // 위치 보정에서 Y도 보정할지
private int _hitPositionSolidMask; // 보정 시 끼이지 않게 검사할 솔리드 레이어
private float _hitPositionCorrectionDuration; // 보정 보간 시간 (0이면 즉시)
private float _hitStunDuration; // 피격 경직 시간
private string _hitReactionState; // 피격자가 재생할 애니메이션 State 이름
private LayerMask _targetLayer; // 데미지를 줄 레이어 (보통 Enemy)
@@ -88,6 +89,7 @@ public void Activate(ActionData data, Vector2 localPosition, Vector2 hitVelocity
_correctHitTargetY = correctHitTargetY;
_hitPositionSolidMask = hitPositionSolidMask;
_hitPositionCorrectionDuration = data.HitPositionCorrectionDuration;
_hitStunDuration = data.HitStunDuration;
_hitReactionState = data.HitReactionAnimationState;
_targetLayer = targetLayer;
_alreadyHit.Clear();
@@ -140,7 +142,7 @@ private void TryDamage(Collider2D other)
_alreadyHit.Add(target);
Debug.Log($"[Hitbox] t={Time.time:F3} damage={_damage} → {other.name} (parent={(target as MonoBehaviour)?.gameObject.name})");
Vector2? targetPosition = GetCorrectionTargetPosition(other);
target.TakeDamage(_damage, _hitVelocity, _hitReactionState, targetPosition, _correctHitTargetY, _hitPositionSolidMask, _hitPositionCorrectionDuration);
target.TakeDamage(_damage, _hitVelocity, _hitReactionState, targetPosition, _correctHitTargetY, _hitPositionSolidMask, _hitPositionCorrectionDuration, _hitStunDuration);
OnHit?.Invoke(target);
}

View File

@@ -15,8 +15,9 @@
// correctHitTargetY — 위 위치 보정에서 Y도 보정할지 (false면 X만)
// hitPositionSolidMask — 위치 보정 시 끼이지 않게 검사할 솔리드 레이어
// hitPositionCorrectionDuration — 위치 보정 보간 시간 (0이면 즉시 스냅)
// hitStunDuration — 피격 경직 시간. 음수면 피격자 기본값 사용
// ============================================================================
public interface IDamageable
{
void TakeDamage(int amount, Vector2 hitVelocity = default, string hitReactionAnimationState = null, Vector2? hitTargetPosition = null, bool correctHitTargetY = false, int hitPositionSolidMask = 0, float hitPositionCorrectionDuration = 0f);
void TakeDamage(int amount, Vector2 hitVelocity = default, string hitReactionAnimationState = null, Vector2? hitTargetPosition = null, bool correctHitTargetY = false, int hitPositionSolidMask = 0, float hitPositionCorrectionDuration = 0f, float hitStunDuration = -1f);
}