feat: 플레이어 다운/넉백 피격 반응 추가

This commit is contained in:
2026-03-19 23:35:51 +09:00
parent 1cb46e1d8d
commit 671f8d8a25
29 changed files with 7108 additions and 55 deletions

View File

@@ -4,6 +4,19 @@ using Unity.Netcode;
namespace Colosseum.Skills
{
/// <summary>
/// 스킬 강제 취소 이유
/// </summary>
public enum SkillCancelReason
{
None,
Manual,
Death,
Stun,
HitReaction,
Respawn,
}
/// <summary>
/// 스킬 실행을 관리하는 컴포넌트.
/// 애니메이션 이벤트 기반으로 효과가 발동됩니다.
@@ -31,6 +44,12 @@ namespace Colosseum.Skills
[Tooltip("범위 표시 지속 시간")]
[Min(0.1f)] [SerializeField] private float debugDrawDuration = 1f;
[Header("디버그")]
[Tooltip("마지막으로 강제 취소된 스킬 이름")]
[SerializeField] private string lastCancelledSkillName = string.Empty;
[Tooltip("마지막 강제 취소 이유")]
[SerializeField] private SkillCancelReason lastCancelReason = SkillCancelReason.None;
// 현재 실행 중인 스킬
private SkillData currentSkill;
private bool skillEndRequested; // OnSkillEnd 이벤트 호출 여부
@@ -47,9 +66,14 @@ namespace Colosseum.Skills
public bool IgnoreRootMotionY => currentSkill != null && currentSkill.IgnoreRootMotionY;
public SkillData CurrentSkill => currentSkill;
public Animator Animator => animator;
public SkillCancelReason LastCancelReason => lastCancelReason;
public string LastCancelledSkillName => lastCancelledSkillName;
private void Awake()
{
lastCancelledSkillName = string.Empty;
lastCancelReason = SkillCancelReason.None;
if (animator == null)
{
animator = GetComponentInChildren<Animator>();
@@ -135,6 +159,7 @@ namespace Colosseum.Skills
currentSkill = skill;
skillEndRequested = false;
waitingForEndAnimation = false;
lastCancelReason = SkillCancelReason.None;
if (debugMode) Debug.Log($"[Skill] Cast: {skill.SkillName}");
@@ -339,16 +364,24 @@ namespace Colosseum.Skills
if (debugMode) Debug.Log($"[Skill] End requested: {currentSkill.SkillName} (will complete after animation)");
}
public void CancelSkill()
/// <summary>
/// 현재 스킬을 강제 취소합니다.
/// </summary>
public bool CancelSkill(SkillCancelReason reason = SkillCancelReason.Manual)
{
if (currentSkill != null)
{
if (debugMode) Debug.Log($"Skill cancelled: {currentSkill.SkillName}");
RestoreBaseController();
currentSkill = null;
skillEndRequested = false;
waitingForEndAnimation = false;
}
if (currentSkill == null)
return false;
lastCancelledSkillName = currentSkill.SkillName;
lastCancelReason = reason;
Debug.Log($"[Skill] Cancelled: {currentSkill.SkillName} / reason={reason}");
RestoreBaseController();
currentSkill = null;
skillEndRequested = false;
waitingForEndAnimation = false;
return true;
}
public bool IsOnCooldown(SkillData skill)