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 커브를 가져와 사용한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
12-9. 데미지 타입 - (3) 속성 저항 데미지 계산 (0) | 2024.12.26 |
---|---|
12-8. 데미지 타입 - (2) 속성 저항 도입 (0) | 2024.12.26 |
12-6. UI - (10) 블록, 크리티컬 메세지 띄우기 (0) | 2024.12.26 |
12-5. UI - (9) 색이 있는 데미지 텍스트 띄우기 (0) | 2024.12.26 |
12-4. 게임플레이 이펙트 컨텍스트 - (3) 활용 (0) | 2024.12.24 |