feat: 방어 시스템과 드로그 검증 경로 정리
- 애니메이션 이벤트 기반 방어/유지/해제 흐름과 HUD 피드백, 방어 디버그 로그를 추가했다. - 드로그 기본기1 테스트 패턴을 정리하고 공격 판정을 OnEffect 기반으로 옮기며 드로그 범위 효과의 타겟 레이어를 정상화했다. - 플레이어 퀵슬롯 테스트 세팅과 적-플레이어 겹침 방지 로직을 조정해 충돌 시 적이 수평 이동을 멈추고 최소 분리만 수행하게 했다.
This commit is contained in:
78
Assets/_Game/Scripts/Combat/DamageContext.cs
Normal file
78
Assets/_Game/Scripts/Combat/DamageContext.cs
Normal 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,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user