공부 잡동사니/Unreal Engine

[UE5] GAS - Gameplay Ability

gamzachips 2025. 4. 17.

Gameplay Ability

GAS에서 캐릭터의 능력(공격,방어,회복 등)을 정의하고 발동하는 요소.

캐릭터의 각 능력을 UGameplyAbility 상속받은 클래스로 만들어 어떤 동작을 하는지 로직을 담고 ASC에 등록해준다. 쿨타임, 타겟팅 기능 등이 지원된다.

GA 클래스 만들기

UGameplayAbility를 상속받은 GA클래스를 만든다.

ActivateAbility함수를 오버라이드 한다. 이 함수의 구현부에 실행될 로직을 작성하면 된다.

로직 작성 후에는 EndAbility를 호출하여 어빌리티가 끝났음을 알려줘야 한다.

UCLASS()
class PG_API UGA_HealAbility : public UGameplayAbility
{
	GENERATED_BODY()
	
public:
	virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle,
		const FGameplayAbilityActorInfo* ActorInfo,
		const FGameplayAbilityActivationInfo ActivationInfo,
		const FGameplayEventData* TriggerEventData) override
	{
			Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
			//TODO : 로직 실행
			EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
	}
};

 

 

ASC에 능력을 등록하기

ASC가 InitAbilityActorInfo 함수를 통해 완전히 초기화된 후에 작업한다.

어빌리티 클래스를 이용해 FGameplayAbilitySpec을 만들어서 ASC에 능력을 부여해주면 된다.

멀티플레이어 게임의 경우 반드시 서버에서 할 것.

void APGPlayerState::BeginPlay()
{
	Super::BeginPlay();

	if (HasAuthority() && AbilitySystemComponent)
	{
		FGameplayAbilitySpec HealSpec(UGA_HealAbility::StaticClass(), 1);
		AbilitySystemComponent->GiveAbility(HealSpec);
	}
}

FGameplayAbilitySpec은 특정 어빌리티를 어떤 레벨로, 어떤 방식으로 부여할지를 담은 구조체.

생성자는 아래와 같다.

FGameplayAbilitySpec(
    TSubclassOf<UGameplayAbility> InAbility, 
    int32 InLevel, 
    int32 InInputID = INDEX_NONE,
    UObject* SourceObject = nullptr
);
  • InAbility : 실제로 부여할 어빌리티 클래스.
  • InLevel : 부여하는 어빌리티의 레벨. 1이 기본 상태이며 추후 능력 레벨업이 가능하다.
  • InInputID : 입력과의 연결을 위한 ID
  • SourceObject : 능력의 소스 객체. 예를 들어, 아이템을 사용해서 생긴 능력이라면 그 아이템을 참조할 수 있다.

 

GA 발동하기

인자로 넣은 어빌리티의 클래스 또는 핸들을 ASC가 가지고 있다면, 찾아서 발동을 시도한다.

조건이 맞지 않으면 발동이 실패할 수 있다.

TryActivateAbilityByClass 는 클래스 기반으로 특정 어빌리티 하나를 발동하는 함수.

AbilitySystemComponent->TryActivateAbilityByClass(UGA_HealAbility::StaticClass());

TryActivateAbility 는 어빌리티 핸들을 기반으로 능력을 발동시킨다.

핸들(FGameplayAbilitySpecHandle)은 GiveAbility 에서 반환하는 것을 받아와도 되고 .Handle 로 얻어와도 된다.

FGameplayAbilitySpecHandle HealHandle = AbilitySystemComponent->GiveAbility(HealSpec);
//OR
FGameplayAbilitySpecHandle HealHandle = HealSpec.Handle;

위의 함수들은 서버에서 호출하는 능력 발동 함수이고,

클라이언트에서 요청하려면 ServerTryActivateAbilityByClass 또는 ServerTryActivateAbility를 호출한다.

댓글