feat: 방어 시스템과 드로그 검증 경로 정리

- 애니메이션 이벤트 기반 방어/유지/해제 흐름과 HUD 피드백, 방어 디버그 로그를 추가했다.
- 드로그 기본기1 테스트 패턴을 정리하고 공격 판정을 OnEffect 기반으로 옮기며 드로그 범위 효과의 타겟 레이어를 정상화했다.
- 플레이어 퀵슬롯 테스트 세팅과 적-플레이어 겹침 방지 로직을 조정해 충돌 시 적이 수평 이동을 멈추고 최소 분리만 수행하게 했다.
This commit is contained in:
2026-04-07 21:28:52 +09:00
parent 147e9baa25
commit 0c9967d131
72 changed files with 231096 additions and 698 deletions

View File

@@ -0,0 +1,78 @@
using UnityEngine;
namespace Colosseum.Combat
{
/// <summary>
/// 피해가 방어/회피 규칙과 함께 전달될 때 사용하는 판정 등급입니다.
/// </summary>
public enum DamageMitigationTier
{
Normal,
Unblockable,
Undodgeable,
}
/// <summary>
/// 피해량과 출처, 방어 가능 여부를 함께 전달하는 런타임 컨텍스트입니다.
/// </summary>
public readonly struct DamageContext
{
public DamageContext(float amount, object source = null, DamageMitigationTier mitigationTier = DamageMitigationTier.Normal)
{
Amount = Mathf.Max(0f, amount);
Source = source;
MitigationTier = mitigationTier;
}
/// <summary>
/// 원본 피해량입니다.
/// </summary>
public float Amount { get; }
/// <summary>
/// 피해 출처입니다. GameObject 또는 Component가 일반적입니다.
/// </summary>
public object Source { get; }
/// <summary>
/// 방어/회피 허용 규칙입니다.
/// </summary>
public DamageMitigationTier MitigationTier { get; }
/// <summary>
/// 현재 피해가 방어 가능한지 여부입니다.
/// </summary>
public bool CanBeGuarded => MitigationTier != DamageMitigationTier.Unblockable;
/// <summary>
/// 현재 피해가 회피 가능한지 여부입니다.
/// </summary>
public bool CanBeDodged => MitigationTier != DamageMitigationTier.Undodgeable;
/// <summary>
/// 피해 출처를 GameObject로 해석합니다.
/// </summary>
public GameObject SourceGameObject => ResolveSourceGameObject(Source);
/// <summary>
/// 같은 메타데이터를 유지한 채 피해량만 교체합니다.
/// </summary>
public DamageContext WithAmount(float amount)
{
return new DamageContext(amount, Source, MitigationTier);
}
/// <summary>
/// object 기반 출처를 GameObject로 변환합니다.
/// </summary>
public static GameObject ResolveSourceGameObject(object source)
{
return source switch
{
GameObject sourceObject => sourceObject,
Component component => component.gameObject,
_ => null,
};
}
}
}