0. 개요

액터가 받는 데미지에 타입을 붙인다.
(Fire, Ice, Thunder 등)

게임플레이 태그를 활용하여 GAS 시스템 내에서 자유롭게 사용할 수 있게 한다.

 

 

1. AuraGameplayTags - Native 게임플레이 태그 생성

	// 데미지
	FGameplayTag Damage;
	FGameplayTag Damage_Fire;

	TArray<FGameplayTag> DamageTypes;

	// 화염 데미지
	GameplayTags.Damage_Fire = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Damage.Fire"),
		FString("Fire Damage Type")
	);

	GameplayTags.DamageTypes.Add(GameplayTags.Damage_Fire);

 

 

2. 게임플레이 어빌리티 생성

이제 기존의 AuraGameplayAbility를 상속받아 데미지를 입히는 어빌리티의 부모인 AuraDamageGameplayAbility 클래스를 생성한다.

 

(1) AuraProjectileSpell 어빌리티 수정

#include "CoreMinimal.h"
#include "AbilitySystem/Abilities/AuraDamageGameplayAbility.h"
#include "AuraProjectileSpell.generated.h"

class AAuraProjectile;
class UGameplayEffect;
/**
 * 
 */
UCLASS()
class AURA_API UAuraProjectileSpell : public UAuraDamageGameplayAbility
{

투사체를 발사하는 어빌리티의 부모를 AuraDamageGameplayAbility로 변경한다.

 

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TSubclassOf<UGameplayEffect> DamageEffectClass;

이제 데미지를 입히는 게임플레이 이펙트 클래스를 해당 부분을 변경된 부모의 protected 섹션으로 옮긴다.

 

		const FGameplayEffectSpecHandle SpecHandle = SourceASC->MakeOutgoingSpec(DamageEffectClass, GetAbilityLevel(), EffectContextHandle);

		FAuraGameplayTags GameplayTags = FAuraGameplayTags::Get();

		// 데미지 타입에 대해 루프
		for (auto& Pair : DamageTypes)
		{
			const float ScaledDamage = Pair.Value.GetValueAtLevel(GetAbilityLevel());
			UAbilitySystemBlueprintLibrary::AssignTagSetByCallerMagnitude(SpecHandle, Pair.Key, ScaledDamage);

		}
		// 데미지 Set by Caller, 싱글톤, 태그-데미지 쌍
		Projectile->DamageEffectSpecHandle = SpecHandle;
		Projectile->FinishSpawning(SpawnTransform);
	}
}

기존에는 GE_Damage를 커브 테이블로 설정하여 레벨 10에 해당하는 값을 AssignTagSetByCallerMagnitude 함수를 이용하여 부여하고 있었는데, 이제 데미지 타입을 추가한 TMap을 순회하여 데미지를 할당할 것이다.

(3번을 참조)

 

 

(2) AuraGameplayAbility 어빌리티 수정

	// 커브 테이블
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, category="Damage")
	FScalableFloat Damage;

이제 AuraDamageGameplayAbility가 데미지를 사용하는 어빌리티가 되었으므로 위의 코드 조각도 해당 어빌리티로 옮긴다.

 

 

(3) AuraDamageGameplayAbility - 데미지를 입히는 어빌리티의 부모

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

public:

protected:
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TSubclassOf<UGameplayEffect> DamageEffectClass;

	// 
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, category = "Damage")
	FScalableFloat Damage;

	UPROPERTY(EditDefaultsOnly, category="Damage")
	TMap<FGameplayTag, FScalableFloat> DamageTypes;
};

추가할 데미지 타입에 따라 데미지를 입힐 수 있도록 태그와 Scalable Float 타입을 쌍으로 가지는 맵을 만든다.

 

 

(4) ExecCalc_Damage 수정

	// Set by Caller Magnitude 가져오기
	float Damage = 0.f;
	for (FGameplayTag DamageType : FAuraGameplayTags::Get().DamageTypes)
	{
		const float DamageTypeValue = Spec.GetSetByCallerMagnitude(DamageType);
		Damage += DamageTypeValue;
	}

이제 태그의 맵을 순회하여 데미지 타입에 따른 데미지 값을 계산하도록 설정한다.

 

 

(5) AuraDamageGameplayAbility 수정

	// 
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, category = "Damage")
	FScalableFloat Damage;

이제 데미지를 따로 계산하기 때문에 위의 코드 조각을 삭제한다.

컴파일 후 발생하는 오류를 수정한다.

 

 

3. 파이어볼트 게임플레이 어빌리티 블루프린트 수정

(1) 디테일 창 - Damage Types 수정

이전에 CT_Damage 커브 테이블에 추가했던 FireBolt 커브를 가져와 사용한다.