- 계수를 커브테이블로 리팩토링 하고자함
- 클래스인포에 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); //디버깅
'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 |