Damage
개요
데미지를 처리하는 ExecCalc입니다.
프로젝트 설정
KKGameModeBase에 데미지 관련 로직에 사용되는 Coefficients를 모아놓은 DamageCalculationCoefficients 커브테이블을 설정해둡니다.

데미지 구조체
struct FDamageStatics
{
DECLARE_ATTRIBUTE_CAPTUREDEF(Armor);
DECLARE_ATTRIBUTE_CAPTUREDEF(ArmorPenetration)
DECLARE_ATTRIBUTE_CAPTUREDEF(CriticalHitChance)
DECLARE_ATTRIBUTE_CAPTUREDEF(CriticalHitDamage);
DECLARE_ATTRIBUTE_CAPTUREDEF(CriticalHitResistance)
FDamageStatics()
{
DEFINE_ATTRIBUTE_CAPTUREDEF(UKKAttributeSet, Armor, Target, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UKKAttributeSet, ArmorPenetration, Source, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UKKAttributeSet, CriticalHitChance, Source, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UKKAttributeSet, CriticalHitDamage, Source, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UKKAttributeSet, CriticalHitResistance, Target, false);
}
};
사용할 Attribute 값을 CAPTURE 합니다.
데미지 로직
방어구 관통
float TargetArmor = 0.f;
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(DamageStatics().ArmorDef,
EvaluationParameters,
TargetArmor);
TargetArmor = FMath::Max<float>(TargetArmor, 0.f);
float SourceArmorPenetration = 0.f;
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(DamageStatics().ArmorPenetrationDef,
EvaluationParameters,
SourceArmorPenetration);
const FRealCurve* ArmorPenetrationCurve = CoefficientsTable->FindCurve(FName("ArmorPenetration"), FString());
const float ArmorPenetrationCoefficient = ArmorPenetrationCurve->Eval(SourceCombatInterface->GetPlayerLevel());
const float EffectiveArmor = TargetArmor * (100 - SourceArmorPenetration * ArmorPenetrationCoefficient) / 100.f;
const FRealCurve* EffectiveArmorCurve = CoefficientsTable->FindCurve(FName("EffectiveArmor"), FString());
const float EffectiveArmorCoefficient = EffectiveArmorCurve->Eval(TargetCombatInterface->GetPlayerLevel());
Damage *= (100 - EffectiveArmor * EffectiveArmorCoefficient) / 100.f;
치명타 데미지
const FRealCurve* CriticalHitResistanceCurve =
CoefficientsTable->FindCurve(FName("CriticalHitResistance"), FString());
const float CriticalHitResistanceCurveCoefficient
= CriticalHitResistanceCurve->Eval(SourceCombatInterface->GetPlayerLevel());
const float EffectiveCriticalHitChance
= SourceCriticalHitChance - TargetCriticalResistance * CriticalHitResistanceCurveCoefficient;
const bool bCritical = FMath::RandRange(1, 100) < EffectiveCriticalHitChance;
UKKAbilitySystemLibrary::SetIsCriticalHit(EffectContextHandle, bCritical);
Damage = bCritical ? Damage * (SourceCriticalHitDamage / 100.f) : Damage;
Last modified: 08 January 2025