[UE5] GAS (3)

GamzaTori·2024년 12월 2일

UE5 C++

목록 보기
27/27

Gameplay Ability

  • 게임 내 캐릭터가 사용할 수 있는 동작이나 스킬
  • 시작, 실행, 종료라는 기본 단계를 가지고 있으며 조건부로 발동될 수 있다.

Gameplay Ability를 상속받은 클래스 생성

  • 해당 클래스를 상속받아 여러 어빌리티를 만든다.
// MyGameplayAbility.h
public:
	UMyGameplayAbility(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());

// GameplayAbility의 핵심적인 함수
protected:
	virtual bool CanActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags, const FGameplayTagContainer* TargetTags, FGameplayTagContainer* OptionalRelevantTags) const override;
	virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;
	virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled) override;

//cpp
UMyGameplayAbility::UMyGameplayAbility(const FObjectInitializer& ObjectInitializer)
	:Super(ObjectInitializer)
{
}

bool UMyGameplayAbility::CanActivateAbility(const FGameplayAbilitySpecHandle Handle,
	const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags,
	const FGameplayTagContainer* TargetTags, FGameplayTagContainer* OptionalRelevantTags) const
{
	if(Super::CanActivateAbility(Handle, ActorInfo, SourceTags, TargetTags, OptionalRelevantTags)==false)
	{
		return false;
	}

	return true;
}

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

void UMyGameplayAbility::EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo,
	const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled)
{
	Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);
}

기본 공격을 어빌리티로 만들어보자

  • 위에서 만든 Ability를 상속받은 클래스 생성
// MyGameplayAbility_Attack.h


// cpp

  • 블루프린트에서 살펴보면 태그, 서버, Cost, Cooldown 등의 옵션을 정해줄 수 있다

캐릭터에 어빌리티 추가

// h
public:
	void AddCharacterAbilities();

	UPROPERTY(EditAnywhere, Category = Abilities)
	TArray<TSubclassOf<class UGameplayAbility>> StartupAbilities;
    
// cpp
void AR1Character::AddCharacterAbilities()
{
	UMyAbilitySystemComponent* ASC = Cast<UMyAbilitySystemComponent>(AbilitySystemComponent);
	if(ASC==nullptr)
	{
		return;
	}

	ASC->AddCharcterAbilities(StartupAbilities);
}
  • 캐릭터가 가지고 있을 어빌리티들을 배열로 가지고 있다
  • TSubclassOf를 사용해 UGameplayAbility를 상속받은 서브클래스들을 가지고 있을 수 있다
  • 스킬의 목록만 가지고 있고 사용하기 위해선 부여해야한다
  • 스킬에 대한 관리는 AbilitySystemComponent에서 한다
// UMyAbilitySystemComponent.h
public:
	void AddcharacetrAbilities(const TArray<TSubclassOf<class UGameplayAbility>>& StartupAbilities);
    
	TArray<FGameplayAbilitySpecHandle> SpecHandles;

// cpp
void UMyAbilitySystemComponent::AddcharacetrAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities)
{
	for(auto& AbilityClass : StartupAbilities)
	{
		FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
		FGameplayAbilitySpecHandle SpecHandle = GiveAbility(AbilitySpec);	// 스킬 부여
        
        SpecHandles.Add(SpecHandle);		// 추후 핸들을 이용해 스킬 사용 및 취소 등

		// 스킬 사용에 관한건 SpecHandle을 이용한다
		// TryActivateAbility(SpecHandle);		// 스킬 사용
		// GiveAbilityAndActivateOnce(AbilitySpec);		// 스킬 부여하자마자 스킬 사용을 한 번 실행
	}
}
  • GiveAbility를 이용해 스킬을 부여할 수 있고 FGameplayAbilitySpecHandle을 반환한다
  • SpecHandle을 이용해 스킬 사용 등을 할 수 있다
profile
게임 개발 공부중입니다.

0개의 댓글