- 속성추가 해주시고
//BP에노출안할거임, c++안에서만 사용되는 원시구조체
struct AuraDamageStatics
{
//캡쳐속성 선언 매크로 : 속성포인터가지고있음
DECLARE_ATTRIBUTE_CAPTUREDEF(Armor);
DECLARE_ATTRIBUTE_CAPTUREDEF(ArmorPenetration);
DECLARE_ATTRIBUTE_CAPTUREDEF(BlockChance);
DECLARE_ATTRIBUTE_CAPTUREDEF(CriticalHitChance);
DECLARE_ATTRIBUTE_CAPTUREDEF(CriticalHitResistance);
DECLARE_ATTRIBUTE_CAPTUREDEF(CriticalHitDamage);
AuraDamageStatics()
{
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, Armor, Target, false); //아머라는 속성을 캡쳐하겠다. from target(적) 스냅샷X
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, BlockChance, Target, false); //아머라는 속성을 캡쳐하겠다.
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, ArmorPenetration, Source, false); //아머라는 속성을 캡쳐하겠다. from 공격자(아우라)임에 주의
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, CriticalHitChance, Source, false); //아머라는 속성을 캡쳐하겠다. from 공격자(아우라)임에 주의
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, CriticalHitResistance, Target, false); //아머라는 속성을 캡쳐하겠다. from 적(고블린)임에 주의
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, CriticalHitDamage, Source, false); //아머라는 속성을 캡쳐하겠다. from 공격자(아우라)임에 주의
}
};
//싱글톤 Getter
static const AuraDamageStatics& DamageStatics()
{
static AuraDamageStatics Dstatics;
return Dstatics;
}
UExecCalc_Damage::UExecCalc_Damage()
{
RelevantAttributesToCapture.Add(DamageStatics().ArmorDef); //캡쳐속성 배열에추가
RelevantAttributesToCapture.Add(DamageStatics().BlockChanceDef); //캡쳐속성 배열에추가
RelevantAttributesToCapture.Add(DamageStatics().ArmorPenetrationDef); //캡쳐속성 배열에추가
RelevantAttributesToCapture.Add(DamageStatics().CriticalHitChanceDef); //캡쳐속성 배열에추가
RelevantAttributesToCapture.Add(DamageStatics().CriticalHitResistanceDef); //캡쳐속성 배열에추가
RelevantAttributesToCapture.Add(DamageStatics().CriticalHitDamageDef); //캡쳐속성 배열에추가
}
- 수학 계산
void UExecCalc_Damage::Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams,
FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const
{
/*치명타 계산*/
float SourceCriticalHitChance = 0.f;
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(DamageStatics().CriticalHitChanceDef, EvaluationParameters,SourceCriticalHitChance ); //치명타얻어오기
SourceCriticalHitChance = FMath::Max<float>(SourceCriticalHitChance,0.f);
float TargetCriticalHitResistance = 0.f;
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(DamageStatics().CriticalHitResistanceDef, EvaluationParameters,TargetCriticalHitResistance ); //치명타얻어오기
SourceCriticalHitChance = FMath::Max<float>(TargetCriticalHitResistance,0.f);
float SourceCriticalHitDamage = 0.f;
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(DamageStatics().CriticalHitDamageDef, EvaluationParameters,SourceCriticalHitDamage ); //치명타얻어오기
SourceCriticalHitDamage = FMath::Max<float>(SourceCriticalHitChance,0.f);
//----------------------- 변수 캡쳐------------------------
const float EffectiveCriticalHitChance = SourceCriticalHitChance-TargetCriticalHitResistance * 0.15f; //실제치명타확률 == 치적 - 치명타저항
const bool bCriticalHit = FMath::RandRange(1,100) < EffectiveCriticalHitChance; //랜덤
if(bCriticalHit) Damage = Damage * 2.f + SourceCriticalHitDamage; //치명타이면 데미지 2배 + 보너스데미지
- 계수 하드코딩을 CT로 해결
하드코딩 fix
//캐릭정보얻고, 커브얻고, 레벨에따른 방관 계수값 얻기
const FRealCurve* CriticalHitResistanceCurve = CharacterClassInfo->DamageCalculationCoefficients->FindCurve(FName("CriticalHitResistance"), FString());
const float CriticalHitResistanceCoefficient = CriticalHitResistanceCurve->Eval(TargetCombatInterface->GetPlayerLevel()); //적의 레벨에따른 값얻기
const float EffectiveCriticalHitChance = SourceCriticalHitChance-TargetCriticalHitResistance * CriticalHitResistanceCoefficient; //실제치명타확률 == 치적 - 치명타저항
* next
- 크리뜨면 노란색으로 구현
how?
현재 크리뜬거는 execCalc 만 알고있음
AS 등에 크리가뜬거를 알려야함
'UE5 > Damage' 카테고리의 다른 글
[UE5] Damage 퀴즈 (0) | 2024.06.24 |
---|---|
[UE5] 데미지계산 계수 하드코딩 fix (0) | 2024.06.24 |
[UE5] 방어력, 방관 구현 (0) | 2024.06.24 |
[UE5] Block Chance 구현 (0) | 2024.06.23 |
[UE5] 실행 계산 개념, 아머속성 계산-변경 구현 (0) | 2024.06.23 |