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

Project_P GA Jump GA 생성

by k99812 2024. 8. 29.

Jump GA 생성


 

GameplayAbility 클래스를 상속받아 PPGA_Jump 클래스를 생성

 

PPGA_Jump 헤더파일


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

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

	virtual bool CanActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags = nullptr, const FGameplayTagContainer* TargetTags = nullptr, OUT FGameplayTagContainer* OptionalRelevantTags = nullptr) const override;

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

	virtual void InputReleased(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) override;

protected:
	UFUNCTION()
	void OnLandedCallback();
};

 

  • UPPGA_Jump();
    • 생성자
  • virtual bool CanActivateAbility(~~~) const override;
    • 부모클래스 GameplayAbility 에서 상속받은 함수
    • 어빌리티 발동시 CanActivateAbility를 실행한 뒤 bool 값에 따라 ActivateAbility 실행
    • override 한 후 GA가 실행할 수 있는 조건을 조절할 수 있음
  • virtual void ActivateAbility(~~~) override;
    • 부모클래스 GameplayAbility 에서 상속받은 함수
    • GA가 발동되면 해당 함수가 실행
    • GA가 처음 실행 됐을때 실행될 로직을 작성하면 됨
  • virtual void InputReleased(~~~) override;
    • 부모클래스 GameplayAbility 에서 상속받은 함수
    • GA에 연결된 Input이 완료(Released) 됐을때 호출 됨
    • 해당 GA에선 Jump를 Stop하는데 사용됨
  • void OnLandedCallback();
    • 해당 GA에선 AbilityTask가 쓰임
    • AbilityTask가 종료될때 호출될 콜백함수

 

PPGA_Jump Cpp파일


생성자

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

 

  • 인스턴스 생성 정책 설정

 

CanActivateAbility

bool UPPGA_Jump::CanActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags, const FGameplayTagContainer* TargetTags, OUT FGameplayTagContainer* OptionalRelevantTags) const
{
	bool bResult = Super::CanActivateAbility(Handle, ActorInfo, TargetTags, OptionalRelevantTags);
	if (!bResult)
	{
		return false;
	}
	
	const ACharacter* Character = Cast<ACharacter>(ActorInfo->AvatarActor.Get());
	return (Character && Character->CanJump());
}

 

  • bool bResult = Super::CanActivateAbility(~~~);
    • 부모 로직을 실행하여 결과값을 받아옴
  • if (!bResult)
    {
    return false;
    }
    • bResult가 false면 false 리턴
  • const ACharacter* Character = Cast<ACharacter>(ActorInfo->AvatarActor.Get());
    • ActorInfo 에서 AvartarActor를 가져와 캐릭터로 형변환
  • return (Character && Character->CanJump());
    • 캐릭터가 nullptr이 아니고 캐릭터의 CanJump함수 결과가 true면 true 리턴

 

ActivateAbility

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

	UPPAT_JumpAndWaitForLanding* JumpAndWatingForLanding = UPPAT_JumpAndWaitForLanding::CreateTask(this);

	JumpAndWatingForLanding->OnComplete.AddDynamic(this, &UPPGA_Jump::OnLandedCallback);

	//AT 실행
	JumpAndWatingForLanding->ReadyForActivation();
}

 

  • Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
    • 부모로직 실행
  • UPPAT_JumpAndWaitForLanding* JumpAndWatingForLanding = 
    UPPAT_JumpAndWaitForLanding::CreateTask(this);
    • #include "GA/AT/PPAT_JumpAndWaitForLanding.h" 추가
    • 어빌리티 태스크 생성
    • GA를 실행하고 바로 로직이 실행되어 종료되는게 아니고
      GA실행 후 어빌리티가 완료 될때까지 기달려야 되는 작업은
      어빌리티 태스크를 이용하여 실행
      • ex) 애니메이션 실행, 점프(점프 후 땅에 착지)
    • 해당 어빌리티 태스크는 다음글에 작성
  • JumpAndWatingForLanding->OnComplete.AddDynamic(this, &UPPGA_Jump::OnLandedCallback);
    • 어빌리티 태스크가 완료됐다고 알려주는 델리게이트 OnComplete에 콜백함수 바인드
  • JumpAndWatingForLanding->ReadyForActivation();
    • 어빌리티 태스크 ReadyForActivation 함수 실행
    • 해당 함수 실행시 어빌리티 태스크가 실행됨

 

InputReleased

void UPPGA_Jump::InputReleased(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo)
{
	Super::InputReleased(Handle, ActorInfo, ActivationInfo);

	ACharacter* Character = Cast<ACharacter>(ActorInfo->AvatarActor.Get());
	Character->StopJumping();
}

 

  • Super::InputReleased(Handle, ActorInfo, ActivationInfo);
    • 부모로직 실행
  • ACharacter* Character = Cast<ACharacter>(ActorInfo->AvatarActor.Get());
    • #include "GameFramework/Character.h" 추가
    • ActorInfo로 부터 아바타 액터를 가져와 캐릭터로 변환
  • Character->StopJumping();
    • 캐릭터의 StopJumping함수 호출

 

OnLandedCallback

void UPPGA_Jump::OnLandedCallback()
{
	bool bReplicatedEndAbility = true;
	bool bWasCancelled = false;
	EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicatedEndAbility, bWasCancelled);
}

 

  • bool bReplicatedEndAbility = true;
    bool bWasCancelled = false;
    • EndAbility함수 호출할때 쓰이는 매개변수
    • bReplicatedEndAbility 
      • EndAbility를 리플리케이션 할지
    • bWasCancelled 
      • 어빌리티가 캔슬되었는지