- 애니메이션 이벤트 기반 방어/유지/해제 흐름과 HUD 피드백, 방어 디버그 로그를 추가했다. - 드로그 기본기1 테스트 패턴을 정리하고 공격 판정을 OnEffect 기반으로 옮기며 드로그 범위 효과의 타겟 레이어를 정상화했다. - 플레이어 퀵슬롯 테스트 세팅과 적-플레이어 겹침 방지 로직을 조정해 충돌 시 적이 수평 이동을 멈추고 최소 분리만 수행하게 했다.
79 lines
2.4 KiB
C#
79 lines
2.4 KiB
C#
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,
|
|
};
|
|
}
|
|
}
|
|
}
|