관리 메뉴

Mini

[UE5] 데미지 유형들 추가, 확장성 refactor 본문

UE5/Advance Damage Techniques

[UE5] 데미지 유형들 추가, 확장성 refactor

Mini_96 2024. 8. 15. 01:54

1. 태그추가

struct FAuraGameplayTags
{
	FGameplayTag Damage_Fire;
GameplayTags.Damage_Fire = UGameplayTagsManager::Get().AddNativeGameplayTag(
    FName("Damage.Fire"),
    FString("Fire Damage Type")
    );

 

2. DamageAbility 추가

상속관계 : Spell -> DamageAbility -> AuraAbility

UCLASS()
class AURA_API UAuraProjectileSpell : public UAuraDamageGameplayAbility

변수 이사

UCLASS()
class AURA_API UAuraDamageGameplayAbility : public UAuraGameplayAbility
{
    GENERATED_BODY()

protected:
    UPROPERTY(EditDefaultsOnly,BlueprintReadOnly) //데미지줄 GE //moved from spell
    TSubclassOf<UGameplayEffect> DamageEffectClass;

    UPROPERTY(EditDefaultsOnly,BlueprintReadOnly, Category="Damage") //moved from parent
    FScalableFloat Damage;
};

맵 변수 추가

UPROPERTY(EditDefaultsOnly, Category="Damaage")
TMap<FGameplayTag, FScalableFloat> DamageTypes; //<태그, 데미지 > 매핑용

 

3. Spell 에서

Map 완탐하면서 데미지계산

void UAuraProjectileSpell::SpawnProjectile(const FVector& ProjectileTargetLocation)
{
    ...

       for(auto& Pair : DamageTypes)
       {
          //레벨별 데미지 얻기
          const float ScaledDamage = Pair.Value.GetValueAtLevel(GetAbilityLevel());
          UAbilitySystemBlueprintLibrary::AssignTagSetByCallerMagnitude(SpecHandle, Pair.Key, ScaledDamage);
       }

 

4. 모든 피해에 대해서 총 데미지 계산 구현

우리는 exec에서 태그로 데미지를 얻어오고있음

이제는 모든 데미지 유형에 대해 데미지를 얻어와야함 -> 태그에서 배열로 관리하면 좋을듯 

void UExecCalc_Damage::Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams,
    FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const
{
    ...
    // Get Damage Set by Caller Magnitude
    float Damage = Spec.GetSetByCallerMagnitude(FAuraGameplayTags::Get().Damage);
 
struct FAuraGameplayTags
{
public:
    ...

    TArray<FGameplayTag> DamageTypes;
GameplayTags.DamageTypes.Add(GameplayTags.Damage_Fire);

 

refactor  후 : 모든 피해에 대해서 총 데미지를 계산가능.

void UExecCalc_Damage::Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams,
    FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const
{
   ...
    // Get Damage Set by Caller Magnitude
    float Damage = 0.f;
    for(FGameplayTag DamageTypeTag : FAuraGameplayTags::Get().DamageTypes)
    {
       const float DamageTypeValue = Spec.GetSetByCallerMagnitude(DamageTypeTag);
       Damage += DamageTypeValue;
    }

 

* 결과확인 :

Map에 여러 효과들을 넣을수있음.

Firebolt 이외에도

 

* 문제 : 크리데미지가 너무 높음

방관1당 1.5 크리데미지가 증가되는모습 -> 방관을 조정하면 되겠군
방관 하향
평타 데미지 10으로 상향

 

* next : 방어력, 마법저항력 구현