본문 바로가기
포트폴리오 제작

Project_P 공격 판정 구현(2) AttackCheck GA 생성

by k99812 2024. 9. 6.

AttackCheck GA 생성


 

GameplayAbility를 상속받아 PPGA_AttackHitCheck를 생성

 

PPGA_AttackHitCheck 헤더파일


#include "CoreMinimal.h"
#include "Abilities/GameplayAbility.h"
#include "PPGA_AttackHitCheck.generated.h"

/**
 * 
 */
UCLASS()
class PROJECT_P_API UPPGA_AttackHitCheck : public UGameplayAbility
{
	GENERATED_BODY()
	
public:
	UPPGA_AttackHitCheck();

	virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;

protected:
	UFUNCTION()
	void TraceResultCallback(const FGameplayAbilityTargetDataHandle& DataHandle);
};

 

  • UPPGA_AttackHitCheck();
    • 생성자
  • virtual void ActivateAbility(~~~) override;
    • GA 실행 함수 상속
  • void TraceResultCallback(const FGameplayAbilityTargetDataHandle& DataHandle);
    • AttackCheckGA에서
      AT를 생성 → AT에서 TargetActor를 생성 → TargetActor에서 공격판정
      → TargetActor에서 AT로 콜백 → AT에서 AttackCheckGA에서 콜백
      순으로 실행 됨
    • TargetActor 부모 클래스에 선언되어 있는 델리게이트에
      매개변수로 (const FGameplayAbilityTargetDataHandle&)가 들어감
      그래서 콜백함수도 똑같이 (const FGameplayAbilityTargetDataHandle&)를 넣어줘야 함

 

Cpp파일


생성자

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

 

인스턴싱 정책 설정

 

ActivateAbility

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

	//#include "GA/AT/PPAT_Trace.h" 추가
	//#include "GA/TA/PPTA_Trace.h" 추가
	UPPAT_Trace* AttackTraceTask = UPPAT_Trace::CreateTask(this, APPTA_Trace::StaticClass());

	AttackTraceTask->OnComplete.AddDynamic(this, &UPPGA_AttackHitCheck::TraceResultCallback);

	AttackTraceTask->ReadyForActivation();
}

 

  • Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
    • 부모함수 실행
  • UPPAT_Trace* AttackTraceTask = UPPAT_Trace::CreateTask(this, APPTA_Trace::StaticClass());
    • 어빌리티 태스크 생성
    • CreateTask() 함수는 AT생성시 필수적으로 생성하는 함수
      매개변수로 AT를 소유할 GA, 추가적으로 필요한 변수를 받음
    • 해당 AT는 매개변수로 (오너GA, 생성할 TA클래스 정보)를 받음
  • AttackTraceTask->OnComplete.AddDynamic(this, &UPPGA_AttackHitCheck::TraceResultCallback);
    • AT가 완료됐을때 알려줄 델리게이트에 콜백 함수를 바인드
  • AttackTraceTask->ReadyForActivation();
    • AT 실행

 

TraceResultCallback

void UPPGA_AttackHitCheck::TraceResultCallback(const FGameplayAbilityTargetDataHandle& DataHandle)
{
	//#include "AbilitySystemBlueprintLibrary.h" 추가
	if (UAbilitySystemBlueprintLibrary::TargetDataHasHitResult(DataHandle, 0))
	{
		FHitResult HitResult = UAbilitySystemBlueprintLibrary::GetHitResultFromTargetData(DataHandle, 0);

		PPGAS_LOG(LogGAS, Log, TEXT("Target %s Detected"), *(HitResult.GetActor()->GetName()));
	}

	bool bReplicateEndAbility = true;
	bool bWasCancelled = false;
	EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicateEndAbility, bWasCancelled);
}

 

  • if (UAbilitySystemBlueprintLibrary::TargetDataHasHitResult(DataHandle, 0))
    • UAbilitySystemBlueprintLibrary의 TargetDataHasHitResult 함수를 통해 DataHandle에 HitResult가 있는지 확인
      DataHandle은 TArray 형태로 데이터를 저장함

    • DataHandle의 0번째 원소에 HitResult가 있으면

    • FHitResult HitResult = UAbilitySystemBlueprintLibrary::GetHitResultFromTargetData(DataHandle, 0);
      • GetHitResultFromTargetData함수를 통해 DataHandle에서 HitResult를 가져옴
    • PPGAS_LOG(LogGAS, Log, TEXT("Target %s Detected"), *(HitResult.GetActor()->GetName()));
      • 추후 어트리뷰트를 만든후 공격 효과를 작성 지금은 단순 로그만 출력
  • bool bReplicateEndAbility = true;
    bool bWasCancelled = false;
    •  EndAbility를 호출하기 위해 필요한 bool변수 생성
  • EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicateEndAbility, bWasCancelled);
    • EndAbility 호출
    • GA의 목적인 공격판정을 끝냈으므로 EndAbility를 호출함

 

블루프린트 생성 및 설정


 

AttackHitCheck GA를 상속받아 블루프린트를 생성

 

 

블루프린트를 연후 Trigggers에서 트리거 태그를 설정

트리거 설정 후 UAbilitySystemBlueprintLibrary::SendGameplayEventToActor(OwerActor, TriggerGameplayTag, PayLoadData);

함수로 해당 GA를 실행할 수 있음