Gameplay Ability
- 게임 내 캐릭터가 사용할 수 있는 동작이나 스킬
- 시작, 실행, 종료라는 기본 단계를 가지고 있으며 조건부로 발동될 수 있다.
Gameplay Ability를 상속받은 클래스 생성
- 해당 클래스를 상속받아 여러 어빌리티를 만든다.
public:
UMyGameplayAbility(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
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;
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를 상속받은 클래스 생성

- 블루프린트에서 살펴보면 태그, 서버, Cost, Cooldown 등의 옵션을 정해줄 수 있다
캐릭터에 어빌리티 추가
public:
void AddCharacterAbilities();
UPROPERTY(EditAnywhere, Category = Abilities)
TArray<TSubclassOf<class UGameplayAbility>> StartupAbilities;
void AR1Character::AddCharacterAbilities()
{
UMyAbilitySystemComponent* ASC = Cast<UMyAbilitySystemComponent>(AbilitySystemComponent);
if(ASC==nullptr)
{
return;
}
ASC->AddCharcterAbilities(StartupAbilities);
}
- 캐릭터가 가지고 있을 어빌리티들을 배열로 가지고 있다
- TSubclassOf를 사용해 UGameplayAbility를 상속받은 서브클래스들을 가지고 있을 수 있다
- 스킬의 목록만 가지고 있고 사용하기 위해선 부여해야한다
- 스킬에 대한 관리는 AbilitySystemComponent에서 한다
public:
void AddcharacetrAbilities(const TArray<TSubclassOf<class UGameplayAbility>>& StartupAbilities);
TArray<FGameplayAbilitySpecHandle> SpecHandles;
void UMyAbilitySystemComponent::AddcharacetrAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities)
{
for(auto& AbilityClass : StartupAbilities)
{
FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
FGameplayAbilitySpecHandle SpecHandle = GiveAbility(AbilitySpec);
SpecHandles.Add(SpecHandle);
}
}
- GiveAbility를 이용해 스킬을 부여할 수 있고 FGameplayAbilitySpecHandle을 반환한다
- SpecHandle을 이용해 스킬 사용 등을 할 수 있다