KillKiss Help

Damage

개요

데미지를 처리하는 ExecCalc입니다.

프로젝트 설정

KKGameModeBase에 데미지 관련 로직에 사용되는 Coefficients를 모아놓은 DamageCalculationCoefficients 커브테이블을 설정해둡니다.

SetGameModeCoffience.png

데미지 구조체

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