- 개요
스킬 관련 GameplayAbility에서 사용할 쿨타임을 설계한다
쿨타임은 비동기로 동작하도록 구성하여 메인 루프에 관계없이 모든 플레이어마다 공평하게 동작하도록 구성한다
따라서 BlueprintAsyncActionReady 클래스를 사용하여 쿨타임을 적용한다
해당 클래스는 C++과 블루프린트 모두에서 비동기 로직을 수행할 수 있도록 만들어주는 클래스이다
1) C++ 사이드
1 - 1) AuraGameplayTags 클래스


스킬 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 / GrantedTags에 CooldownTag가 존재한다면, 다음의 로직을 진행한다
- 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번째 시퀀스를 위와 같이 설정한다
BPOverlayWidetController로부터 ASC를 가져오고 WaitForCooldownChange 함수를 호출하여
쿨타임이 시작 + 쿨타임이 종료되는 경우에 따른 로그를 출력한다
- 최종 실행 결과
'언리얼 엔진 - 게임 프로젝트 > GAS 프레임워크 RPG 프로젝트' 카테고리의 다른 글
| 경험치와 레벨업 - 1) LevelUpInfo 클래스를 통한 레벨 정의 (0) | 2025.10.23 |
|---|---|
| 코스트와 쿨타임 - 최종) 쿨타임과 UI 연동 (0) | 2025.10.19 |
| 코스트와 쿨타임 - 3) 어빌리티와 UI 연동 마무리 + 어빌리티 비용 설정 (0) | 2025.10.18 |
| 코스트와 쿨타임 - 2) 어빌리티와 Tag 연동 + 어빌리티와 UI 연동 세팅 (0) | 2025.10.18 |
| 코스트와 쿨타임 - 1) 스킬 UI + 경험치 UI (0) | 2025.10.17 |