1. 공격 게임플레이 어빌리티

(1) 게임플레이 어빌리티 생성

#pragma once

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

UCLASS()
class AURA_API UAuraMeleeAttack : public UAuraDamageGameplayAbility
{
	GENERATED_BODY()
	
};

 

 

(2) Native 게임플레이 태그 생성

	// 어빌리티
	FGameplayTag Abilities_Attack;
	// 어빌리티
	GameplayTags.Abilities_Attack = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Abilities.Attack"),
		FString("공격 어빌리티")
	);

 

 

(3) CharacterClassInfo에서 기본 어빌리티 부여

USTRUCT(BlueprintType)
struct FCharacterClassDefaultInfo
{
	GENERATED_BODY()

	// 1차 속성의 기본값을 적용하는 게임플레이 이펙트 - 공통
	UPROPERTY(EditDefaultsOnly, Category="Class Defaults")
	TSubclassOf<UGameplayEffect> PrimaryAttributes;

	// 기본 어빌리티
	UPROPERTY(EditDefaultsOnly, Category = "Class Defaults")
	TArray<TSubclassOf<UGameplayAbility>> StartupAbilities;
};

 

 

(4) 어빌리티 시스템 라이브러리의 GiveStartUpAbilities 리펙토링

이제 이 함수가 몬스터의 특성(워리어, 마법, 궁수)에 따라서 초기 어빌리티를 부여하도록 설정한다.

	UFUNCTION(BlueprintCallable, category = "AuraAbilitySystemLibrary|CharacterClassDefaults")
	static void GiveStartupAbilities(const UObject* WorldContextObject, UAbilitySystemComponent* ASC, ECharacterClass CharacterClass);
void UAuraAbilitySystemLibrary::GiveStartupAbilities(const UObject* WorldContextObject, UAbilitySystemComponent* ASC, ECharacterClass CharacterClass)
{
	UCharacterClassInfo* CharacterClassInfo = GetCharacterClassInfo(WorldContextObject);
	if (CharacterClassInfo == nullptr)
		return;

	for (TSubclassOf<UGameplayAbility> AbilityClass : CharacterClassInfo->CommonAbilities)
	{
		FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
		ASC->GiveAbility(AbilitySpec);
	}

	// 캐릭터 특성에 따른 어빌리티 부여
	const FCharacterClassDefaultInfo& DefaultInfo = CharacterClassInfo->GetClassDefaultInfo(CharacterClass);
	for (auto& AbilityClass : DefaultInfo.StartupAbilities)
	{
		ICombatInterface* CombatInterface = Cast<ICombatInterface>(ASC->GetAvatarActor());
		if (CombatInterface)
		{
			FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, CombatInterface->GetPlayerLevel());
			ASC->GiveAbility(AbilitySpec);
		}
	}
}

어빌리티의 수준을 몬스터의 레벨에 따라 부여하기 위해 전투 인터페이스를 캐스팅하여 사용한다.

 

 

2. 공격 게임플레이 어빌리티 블루프린트

(1) 블루프린트 생성

새롭게 생성한 C++ 게임플레이 어빌리티를 상속받는 블루프린트 GA_MeleeAttack을 생성한다.

해당 태그를 받으면 어빌리티가 작동하도록 설정한다.

 

 

(2) DA_CharacterClassInfo에서 초기 어빌리티 지정

 

 

(3) BTT_Atack 비헤이비어 트리 태스크 수정

태스크가 시작되면 ASC를 가져와 태그로 어빌리티를 활성화 시도를 한다.

이 때, 태그는 멤버변수로 만들고 기본값으로 Abilities.Attack을 설정한다.

 

 

(4) GA_Attack 어빌리티로 디버그 구체 그리기

어빌리티가 활성화되면 아바타 액터의 위치를 가져와 디버그 구체를 그린다.

인스턴싱 정책을 액터마다 인스턴스로 설정하면 하나의 인스턴스를 사용한다.