관리 메뉴

Mini

[UE5] 치명타 구현 본문

UE5/Damage

[UE5] 치명타 구현

Mini_96 2024. 6. 24. 02:37

 

- 속성추가 해주시고

//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로 해결

CT에 행추가

하드코딩 fix

//캐릭정보얻고, 커브얻고, 레벨에따른 방관 계수값 얻기
const FRealCurve* CriticalHitResistanceCurve = CharacterClassInfo->DamageCalculationCoefficients->FindCurve(FName("CriticalHitResistance"), FString());
const float CriticalHitResistanceCoefficient = CriticalHitResistanceCurve->Eval(TargetCombatInterface->GetPlayerLevel()); //적의 레벨에따른 값얻기

const float EffectiveCriticalHitChance = SourceCriticalHitChance-TargetCriticalHitResistance * CriticalHitResistanceCoefficient; //실제치명타확률 == 치적 - 치명타저항

결과 : 크리뜨면 89가 뜨는 모습 (원래는 41)

 

* next

- 크리뜨면 노란색으로 구현

how?

현재 크리뜬거는 execCalc 만 알고있음

AS 등에 크리가뜬거를 알려야함

 

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/abc94e36461a5db181a58e01b9162c3cfa246aff

 

feat : 치명타 구현 · DongHoonYu96/GameplayAbilitySystem_Aura@abc94e3

Bisu96 committed Jun 23, 2024

github.com

 

 

 

 

'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