본문 바로가기

게임프로그래밍/실습2

[실습2] 64. GAS 쿨다운 적용하기

1. 쿨다운 설정하기

 

SetByCaller를 이용하여 쿨다운을 적용할 것이다.

 

우리가 사용할 게임플레이 어빌리티 클래스에 들어가 쿨다운을 설정해주자.

UPROPERTY(BlueprintReadOnly, EditAnywhere, Category="Cooldown")
FScalableFloat CooldownDuration;

UPROPERTY(BlueprintReadOnly, EditAnywhere, Category="Cooldown")
FGameplayTagContainer CooldownTags;

UPROPERTY(Transient)
FGameplayTagContainer TempCooldownTags;

 

그리고 이제 함수 하나를 오버라이드 한다. 해당 함수는 쿨다운 태그의 집합을 리턴해준다.

virtual FGameplayTagContainer* GetCooldownTags() const override;
FGameplayTagContainer* UAuraGameplayAbility::GetCooldownTags() const
{
    FGameplayTagContainer* MutableTags = const_cast<FGameplayTagContainer*>(&TempCooldownTags);
    MutableTags->Reset();
    const FGameplayTagContainer* ParentTags = Super::GetCooldownTags();
    if (ParentTags)
    {
       MutableTags->AppendTags(*ParentTags);
    }
    MutableTags->AppendTags(CooldownTags);
    return MutableTags;
}

 

 

이제 다음 함수를 오버라이드 하자.

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

 

void UAuraGameplayAbility::ApplyCooldown(const FGameplayAbilitySpecHandle Handle,
    const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) const
{
    UGameplayEffect* CooldownGE = GetCooldownGameplayEffect();
    if (CooldownGE)
    {
       FGameplayEffectSpecHandle SpecHandle = MakeOutgoingGameplayEffectSpec(CooldownGE->GetClass(), GetAbilityLevel());
       SpecHandle.Data.Get()->DynamicGrantedTags.AppendTags(CooldownTags);
       SpecHandle.Data.Get()->SetSetByCallerMagnitude(FGameplayTag::RequestGameplayTag(FName("Cooldown.Aura")), CooldownDuration.GetValueAtLevel(GetAbilityLevel()));
       ApplyGameplayEffectSpecToOwner(Handle, ActorInfo, ActivationInfo, SpecHandle);
    }

}

 

여기서 쿨다운 태그의 네임은 자기가 만든 쿨다운 태그를 입력하면 된다.


2. 쿨다운 게임플레이 이펙트 만들기

 

이제 게임플레이 이펙트를 만들어 쿨다운 시간과 태그만 설정해주면 된다.

 

 

이제 게임플레이 어빌리티에서 설정을 해주면 될 것이다.

 

 

저기서 쿨다운 기간은 일단은 하드코딩을 해주었다. 나중에 커브테이블을 이용하면 더욱 정교하게 쿨다운을 설정할 수 있을 것이다.


참고

https://github.com/tranek/GASDocumentation?tab=readme-ov-file#concepts-ge-cooldown