관리 메뉴

Mini

[UE5] 데미지계산 계수 하드코딩 fix 본문

UE5/Damage

[UE5] 데미지계산 계수 하드코딩 fix

Mini_96 2024. 6. 24. 02:17

- 계수를 커브테이블로 리팩토링 하고자함

하드코딩된 계수
상수값(레벨에 딱맞는 1개값)만 필요하기때문에 Constant 사용
레벨에 따라 방관계수 구현 (방관의 효율을 깍음)
레벨에따라 유효아머 계수 구현 (유효아머를 깍음)

 

- 클래스인포에 CT 변수추가

class AURA_API UCharacterClassInfo : public UDataAsset
{
    ...

    UPROPERTY(EditDefaultsOnly,Category="Common Class Defaults")
    TObjectPtr<UCurveTable> DamageCalculationCoefficients;

의존성 주입

* CT에 접근방법

게임모드 접근후, 게임모드에 있는 클래스정보를 리턴하면됨

클래스정보 @Getter를 라이브러리에서 구현

UCharacterClassInfo* UAuraAbilitySystemLibrary::GetCharacterClassInfo(const UObject* WorldContextObject)
{
    //게임모드를 얻어오고
    AAuraGameModeBase* AuraGameMode = Cast<AAuraGameModeBase>(UGameplayStatics::GetGameMode(WorldContextObject));
    if(AuraGameMode==nullptr) return nullptr;

    //게임모드에있는 클래스정보들에 대해
    return  AuraGameMode->CharacterClassInfo;
}

 

 

* 캐릭터정보 안의 CT에 접근해서 넣어주면됨

-레벨을 얻기위해 전투인터로 만들기

void UExecCalc_Damage::Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams,
    FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const
{
    ...
    AActor* SourceAvatar = SourceASC ? SourceASC->GetAvatarActor() : nullptr;
    AActor* TargetAvatar = TargetASC ? TargetASC->GetAvatarActor() : nullptr;

    //레벨을 얻기위해 인터페이스로 만듬
    ICombatInterface* SourceCombatInterface = Cast<ICombatInterface>(SourceAvatar);
    ICombatInterface* TargetCombatInterface = Cast<ICombatInterface>(TargetAvatar);

- 레벨에따른 계수 얻기

//캐릭정보얻고, 커브얻고, 레벨에따른 방관 계수값 얻기
const UCharacterClassInfo* CharacterClassInfo = UAuraAbilitySystemLibrary::GetCharacterClassInfo(SourceAvatar); //소스아바타(아우라)의 정보얻기
const FRealCurve* ArmorPenetrationCurve = CharacterClassInfo->DamageCalculationCoefficients->FindCurve(FName("ArmorPenetration"), FString());
const float ArmorPenetrationCoefficient = ArmorPenetrationCurve->Eval(SourceCombatInterface->GetPlayerLevel()); //아우라의 레벨에따른 값얻기

//방관은 방어력을 %로 무시함 , ex : 방관100이면 방어 100% 무시함 / 뒤의계수 == op 조정
if(SourceArmorPenetration>100.f) SourceArmorPenetration=100.f;
const float EffectiveArmor = TargetArmor *= (100 - SourceArmorPenetration * ArmorPenetrationCoefficient) / 100.f; //유효방어력 = 방관계산후 방어력

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

Damage *= (100-EffectiveArmor * EffectiveArmorCoefficient) / 100.f;

 

* CT 값과 잘 일치하는지 Test

브레이크 포인트 걸었는데 Classinfo가 null이떠서, 직접 뷰포트에 찍어봤음.

FString TheFloatStr = FString::SanitizeFloat(EffectiveArmorCoefficient);
GEngine->AddOnScreenDebugMessage(1,8.f,FColor::Blue,TheFloatStr); //디버깅

결과 : 레벨 1의 값인 .333이 잘나온다.
고블린 렙을 40으로 바꾼후 test, 0.085가 잘나온다.

 

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

 

fix : 데미지계산 계수 하드코딩 fix · DongHoonYu96/GameplayAbilitySystem_Aura@fa33c57

Bisu96 committed Jun 23, 2024

github.com

 

'UE5 > Damage' 카테고리의 다른 글

[UE5] Damage 퀴즈  (0) 2024.06.24
[UE5] 치명타 구현  (0) 2024.06.24
[UE5] 방어력, 방관 구현  (0) 2024.06.24
[UE5] Block Chance 구현  (0) 2024.06.23
[UE5] 실행 계산 개념, 아머속성 계산-변경 구현  (0) 2024.06.23