본문 바로가기
Unreal 게임 개발/Unreal 강의 개인 정리

Notify로 GA실행 & GameplayAbilityTargetActor - GAS

by daisy0461 2025. 8. 22.

Notify로 특정 Tag를 가진 GA 실행

현재 공격은 Montage로 진행된다.

Montage에 넣을 AnimNotify를 다음과 같이 작성한다.

#include "Animation/AnimNotify_GASAttackHitCheck.h"
#include "AbilitySystemBlueprintLibrary.h"

UAnimNotify_GASAttackHitCheck::UAnimNotify_GASAttackHitCheck()
{
}

FString UAnimNotify_GASAttackHitCheck::GetNotifyName_Implementation() const
{
	//에디터에서 표시할 텍스트를 보여주면 된다.
	return TEXT("GASAttackHitCheck");
}

void UAnimNotify_GASAttackHitCheck::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference)
{
	Super::Notify(MeshComp, Animation, EventReference);

	if (MeshComp)
	{
		AActor* OwnerActor = MeshComp->GetOwner();
		if (OwnerActor)
		{
			FGameplayEventData PayloadData;
			//ASC를 가지고 있는 Actor에 Tag를 넣어서 이벤트를 발동시키는 함수이다.
			UAbilitySystemBlueprintLibrary::SendGameplayEventToActor(OwnerActor, TriggerGameplayTag, PayloadData);
		}
	}
}

이렇게 Notify되면 해당 Mesh를 가지고 있는 ASC를 가지고 있는 Actor에게 Tag를 넣어서 이벤트를 발생시킨다.

AninNotify를 넣고 클릭해서 Trigger Gameplay Tag에 알맞은 Tag(Character.Action.AttackHitCheck)를 넣어준다.

 

#include "GA/ABGA_AttackHitCheck.h"
#include "ArenaBattleGAS.h"

UABGA_AttackHitCheck::UABGA_AttackHitCheck()
{
	InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerActor;
}

void UABGA_AttackHitCheck::ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData)
{
	Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);

	GAS_LOG(LogABGAS, Log, TEXT("Begin"));

	bool bReplicatedEndAbility = true;
	bool bWasCancelled = false;

	EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicatedEndAbility, bWasCancelled);
}

이제 HitCheck를 할 GA를 만들어주고 캐릭터의 ASC에 넣어준다.

해당 c++로 Blueprint를 제작하고

Ability Triggers 요소를 추가하고 Trigger Tag에 해당 Tag (Character.Action.AttackHitCheck)를 넣으면 

시스템이 해당 Tag를 감지하고 발동시킨다.

해당 Tag도 이후에 변경할 수 있으므로 Blueprint로 만들어서 지정해주는 것이 편리하다.

 

이 동작은

GameplayEventData를 Actor에게 보낼 때
해당 Actor의 ASC의 등록된 어빌리티 중에서 Trigger(Notify의 TriggerGameplayTag)가
해당 Trigger(GA의 Trigget Tag)로 지정되어 있는 어빌리티를 인식하고 활성화시킨다.

 

 

 

GAS의 GameplayAbilityTargetActor (TA)

  • 게임플레이 어빌리티에서 대상에 대한 판정(물리 판정)을 구현할 때 사용하는 특수한 Actor이다.
  • 줄여서 TA라고 함.
  • AGameplayAbilityTargetActor 클래스를 상속받아서 구현한다.

타겟 액터(TA)가 필요한 이유

어빌리티가 적용될 대상을 어떻게 선택할지 유연하게 정의할 수 있다.

간단하게 누구에게 영향을 미칠지 또는 어디에 영향을 줄지 정의하는 것이다.

예를 들어

  • 근접 공격 : 플레리어 앞에 있는 적 한명만 타겟
  • 원거리 공격 : 조준하고 있는 지점에 있는 적 타겟
  • 범위 공격 : 지정한 위치에 있는 적 모두 타겟

이러한 것을 Ability안에 모두 적용시키면 복잡해지지만 TargetActor로 분리하면 깔끔하게 사용 가능하다.

또한 네트워크도 지원해서 클라이언트에서 타겟팅하면 해당 위치 정보가 서버로 전송되어 서버에서도 실제 어빌리티가 실행된다.

 

TA의 주요 함수

  • StartTageting : 타겟팅을 시작
  • ConfirmTargetingAndContinue : 타겟팅을 확정하고 이후 남은 프로세스를 진행.
  • ConfirmTargeting : 태스크 진행 없이 타겟팅만 확정
  • CancelTargeting : 타겟팅을 취소

GameplayAbilityTargetData

  • Target Actor에서 판정한 결과를 담은 데이터이다.
  • 타겟 데이터를 여러 개 묶어 전송하는 것이 일반적인데 이를 타겟 데이터 핸들이라 한다.
    FGameplayAbilityTargetDataHandle은 내부적으로 TArray<TSharedPtr<FGameplayAbilityTargetData>>를
    들고 있는 컨테이너이다.

  • 속성
    - Trace hit Result
    - 판정된 다수의 액터 포인터
    - 시작 지점
    - 끝 지점

AbilityTask와 TargetActor사이의 실행 흐름

  1. AT에서 SpawnActorDeferred(지연 생성)로 TargetActor 생성 시작
  2. 생성을 마무리하는 FinishSpawning전까지 TA의 Delegate 구독이나 TA의 초기 변수 설정 등 TA 초기화 한다.
  3. FinishSpawning으로 스폰이 완료된다. -> 본격적인 타겟팅 시작. (TA에서 StartTageting 호출)
  4. 소스 액터(Ability Task를 발동한 Actor)를 저장
  5. 타겟 컨펌(ConfirmTargeting) 후 최종 타겟 데이터를 생성한다.
  6. TargetActor에서 제공하는 TargetDataReady라는 Delegate를 통해 최종 타겟 데이터를 AT에 전달한다.
    (해당 Delgate는 SpawnActorDeferred와 FinishSpawning 사이에 구독한다.)
  7. 데이터를 받고 AT는 자신의 Task를 종료한다.