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
- 어빌리티가 캔슬되었는지
'포트폴리오 제작 > Project_P' 카테고리의 다른 글
Project_P Attack GA 생성(1) 헤더파일 (0) | 2024.09.02 |
---|---|
Project_P Jump 어빌리티 태스크 생성 (0) | 2024.08.29 |
Project_P GA 블루프린트 생성 및 태그 설정 (0) | 2024.08.28 |
Project_P 게임플레이 태그 관리 및 추가 (0) | 2024.08.27 |
Project_P 캐릭터에 GA 부여 및 GA 실행 (0) | 2024.08.27 |