언리얼 엔진 - 게임 프로젝트/GAS 프레임워크 RPG 프로젝트

코스트와 쿨타임 - 4) BlueprintAsyncActionReady 클래스를 사용한 어빌리티 쿨타임 설계

monstro 2025. 10. 18. 23:58
728x90
반응형

- 개요

스킬 관련 GameplayAbility에서 사용할 쿨타임을 설계한다

쿨타임은 비동기로 동작하도록 구성하여 메인 루프에 관계없이 모든 플레이어마다 공평하게 동작하도록 구성한다

따라서 BlueprintAsyncActionReady 클래스를 사용하여 쿨타임을 적용한다

해당 클래스는 C++블루프린트 모두에서 비동기 로직을 수행할 수 있도록 만들어주는 클래스이다

 

1) C++ 사이드

1 - 1) AuraGameplayTags 클래스

스킬 GA의 쿨타임을 의미하는 Tag

 

추가한 Tag를 실제로 생성

 

스킬 GA의 쿨타임을 의미하는 Tag를 추가하고, 추가한 Tag를 실제로 생성한다

 

1 - 2) WaitCooldownChange 클래스

 

CooldownChangeSignature 델리게이트를 추가한다

해당 델리게이트는 float 값을 인자로 받으면서 C++과 블루프린트 모두에서 사용하며 1 : 多로 전파한다

 

멤버변수와 멤버함수의 구성

 

멤버변수와 멤버변수의 구성은 위와 같다

멤버변수는 다음과 같이 구성되어 있다

  • CooldownStart : 쿨타임이 시작되었음을 전파
  • CooldownEnd : 쿨타임이 종료되었음을 전파
  • ASC : GA에 쿨타임의 GE를 적용하고 취소ASC
  • CooldownTag : 스킬별 쿨타임의 Tag

 

 

BlueprintAsyncActionReady 클래스는 static 인스턴스를 생성하여 사용한다

따라서 WaitForCooldownChange 함수를 호출하여 WaitCooldownChange의 static 인스턴스를 반환한다

로직은 다음과 같다

  • NewObject를 통해 새로운 WaitCooldownChange 인스턴스를 생성
  • 생성한 인스턴스의 ASC 멤버변수 + CooldownTag 멤버변수를 설정
  • 인자로 받은 AbilitySystemComponent를 사용하여 다음의 동작 수행
    • Tag생성 / 추가되면 CooldownTagChanged 함수 호출
    • Duration GE가 적용되면 OnActiveEffectAdded 함수 호출

 

위의 동작을 수행한 이후에 생성한 인스턴스를 반환한다

 

 

EndTask 함수의 로직은 위와 같다

ASC 멤버변수의 RegisterGameplayTagEvent 델리게이트에 바인드된 요소들을 전부 제거한다

이후 SetReadyToDestroy 함수와 MarkAsGarbage 함수를 호출하여

생성한 static 인스턴스를 제거하고 Garbage Collecting되도록 설정한다

 

 

CooldownTagChanged 함수의 로직은 위와 같다

인자로 받은 정수값0이라면, CooldownEnd 델리게이트를 브로드캐스트한다

 

 

OnActiveEffectAdded 함수의 로직은 위와 같다

인자로 받은 GESpec갖고 있는 Tag + GESpec이 부여할 Tag를 각각 AssetTags / GrantedTags에 저장한다

이후 AssetTags / GrantedTagsCooldownTag가 존재한다면, 다음의 로직을 진행한다

  • CooldownTag에 해당하는 Tag를 지닌 GameplayEffect의 Duration을 가져와 저장
  • 저장한 값이 하나라도 존재한다면, 저장한 값중에서 가장 높은 값을 저장
  • 2번째 로직에서 저장한 값CooldownStart 델리게이트에 인자로 넘겨 브로드캐스트

 

2) 블루프린트 사이드

2 - 1) GE_Cooldown_FireBolt 블루프린트

 

해당 GameplayEffect가 적용되면 부여할 Tag를 위와 같이 설정한다

 

 

해당 GE의 Duration을 위와 같이 설정한다

 

2 - 2) GA_Firebolt 블루프린트

 

Cooldown Gameplay Effect Class를 2-1)의 GE로 설정한다

 

2 - 3) WBP_SpellGlobe 위젯 블루프린트

WidgetControllerSet 이벤트의 3번째 시퀀스

 

WidgetControllerSet 이벤트의 3번째 시퀀스를 위와 같이 설정한다

BPOverlayWidetController로부터 ASC를 가져오고 WaitForCooldownChange 함수를 호출하여

쿨타임이 시작 + 쿨타임이 종료되는 경우에 따른 로그를 출력한다

 

- 최종 실행 결과

 

728x90
반응형