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
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[언리얼] 액터배열에서 가장 가까운 순서대로 액터 정렬하기 (0) | 2025.01.08 |
---|---|
[실습2] 발사체 스프레드 코드 (0) | 2025.01.07 |
[실습2] 63. 게임플레이어빌리티시스템 Cost 적용하기 (0) | 2025.01.01 |
[실습2] 62. 일정 범위 안에 있는 액터 배열에 담기 (0) | 2024.12.29 |
[실습2] 61. 에너미에 환경 쿼리 적용하기 (0) | 2024.12.29 |