1. 근접 공격 데미지 부여

(1) GA_MeleeAttack 클래스 기본 설정

Damage Effect Class는 수행 계산(ExecCalc_Damage)를 이용하여 데미지를 계산하는 GE_Damage 이펙트를 사용한다.

Damage Types의 추가 버튼을 눌러 어떤 데미지를 입힐지 선택한다.

근접 물리 데미지이므로 Damage.Physical 타입의 데미지를 입히며 입히는 데미지는 CT_Damage 커브 테이블을 이용한다.

 

(2) GA_MeleeAttack 블루프린트 그래프

이제 게임플레이 이펙트 스펙을 만들어 Set by Caller Magnitude와 태그를 적용하고 스펙을 내보내어 이펙트를 적용하도록 할 것이다.

앞으로의 편의성을 위해 위의 과정을 함수로 간단하게 사용할 수 있도록 만들 것이다.

 

 

(3) AuraDamageGameplayAbility에서 데미지 게임플레이 이펙트 스펙 만드는 함수 선언하기

public:
	UFUNCTION(BlueprintCallable)
	void CauseDamage(AActor* TargetActor);
#include "AbilitySystem/Abilities/AuraDamageGameplayAbility.h"
#include "AbilitySystemBlueprintLibrary.h"
#include "AbilitySystemComponent.h"

void UAuraDamageGameplayAbility::CauseDamage(AActor* TargetActor)
{
	FGameplayEffectSpecHandle DamageSpecHandle =  MakeOutgoingGameplayEffectSpec(DamageEffectClass, 1.f);
	for (auto& Pair : DamageTypes)
	{
		float DamageMagnitude = Pair.Value.GetValueAtLevel(GetAbilityLevel());
		UAbilitySystemBlueprintLibrary::AssignTagSetByCallerMagnitude(DamageSpecHandle, Pair.Key, DamageMagnitude);
	}
	GetAbilitySystemComponentFromActorInfo()->ApplyGameplayEffectSpecToTarget(*DamageSpecHandle.Data.Get(), UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor));
}

DamageGameplayAbility의 멤버 변수인 DamageEffectClass를 활용하여 데미지 스펙 핸들을 만든다.

게임플레이 태그와 확장 가능한 플로트를 페어로하는 데미지 타입 맵을 순회하여 어빌리티의 레벨에 따른 값을 가져와 SetByCallerMagnitude 함수에 넘겨준다.

이후에 적용할 대상의 ASC에서 게임플레이 이펙트를 발동시킨다.

 

- DamageSpecHandle.Data.Get()는 게임플레이 이펙트 스펙의 포인터이므로 참조를 반환하기 위해 역참조(Dereference)한다.

 

 

(4) GA_MeleeAttack에서 새로 생성한 함수 호출하기

이제 플레이를 하면 근접 몬스터가 플레이어 캐릭터에 올바르게 데미지를 입히는 것을 볼 수 있다.