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사이의 실행 흐름
- AT에서 SpawnActorDeferred(지연 생성)로 TargetActor 생성 시작
- 생성을 마무리하는 FinishSpawning전까지 TA의 Delegate 구독이나 TA의 초기 변수 설정 등 TA 초기화 한다.
- FinishSpawning으로 스폰이 완료된다. -> 본격적인 타겟팅 시작. (TA에서 StartTageting 호출)
- 소스 액터(Ability Task를 발동한 Actor)를 저장
- 타겟 컨펌(ConfirmTargeting) 후 최종 타겟 데이터를 생성한다.
- TargetActor에서 제공하는 TargetDataReady라는 Delegate를 통해 최종 타겟 데이터를 AT에 전달한다.
(해당 Delgate는 SpawnActorDeferred와 FinishSpawning 사이에 구독한다.) - 데이터를 받고 AT는 자신의 Task를 종료한다.
'Unreal 게임 개발 > Unreal 강의 개인 정리' 카테고리의 다른 글
| 캐릭터 어트리뷰트 & 데미지 입히기(Attribute 사용) - GAS (0) | 2025.08.23 |
|---|---|
| AbilityTask와 TargetActor를 활용한 물리 판정 - GAS (0) | 2025.08.22 |
| GA에서 AT 사용 방법 (+BP) - GAS (0) | 2025.08.20 |
| 공격 입력처리 & 인스턴싱 옵션 & 어빌리티 태스크 - GAS (3) | 2025.08.20 |
| GA Spec & 점프 입력처리 - GAS (0) | 2025.08.19 |