- 개요
이전까지는 GameMode에 캐릭터의 직업군과 플레이어의 스킬 정보를 저장하였지만,
클라이언트는 GameMode에 접근할 수 없으므로 GameMode의 사본인 GameInstance를 사용하여
해당 정보를 저장하고 서버 - 클라이언트 모두 GameInstance를 통해 해당 정보에 접근한다
또, 스킬 어빌리티를 Equip하여 장착하고 장착한 스킬 어빌리티를 UI를 통해 표현한다
- C++ 사이드
1) 구조 변경
1 - 1) AuraGameInstance 클래스

GameMode 클래스에 존재하던 기존의 정보를 GameInstance로 옮겨서 저장한다
1 - 2) AuraAbilitySystemLibrary 클래스

캐릭터의 직업군 정보를 가져오기 위한 GetCharacterClassInfo 함수와
스킬에 대한 정보를 가져오기 위한 GetAbilityInfo 함수 모두 GameInstance를 통해 수행하도록 수정한다
2) 스킬 어빌리티 장착
2 - 1) AuraAbilitySystemComponent 클래스

AbilityEquipped 델리게이트를 추가하여 Equip할 스킬과 관련한 정보를 브로드캐스트한다
Equip할 스킬의 Tag / 해당 스킬의 상태 / 해당 스킬을 추가할 슬롯 / 해당 스킬을 이전에 놓았던 슬롯을 전파한다

추가한 델리게이트를 멤버변수로 추가한다



위와 같이 7개의 함수를 새롭게 추가한다
- GetStatusFromAbilityTag 함수 : 스킬 어빌리티의 Tag를 통해 스킬의 상태를 반환
- GetInputTagFromAbilityTag 함수 : 스킬 어빌리티의 Tag를 통해 스킬을 발동하기 위한 입력키의 Tag를 반환
- ServerEquipAbility 함수 : 클라이언트에서 호출하여 서버에서 수행 + 스킬 어빌리티를 Equip
- ClientEquipAbility 함수 : 서버에서 호출하여 클라이언트에서 수행 + 스킬 어빌리티를 Equip
- ClearSlot 함수 : Equip할 스킬의 슬롯을 초기화
- ClearAbilitiesOfSlot 함수 : Equip할 스킬의 슬롯에 있는 기존의 스킬 어빌리티를 제거
- AbilityHasSlot 함수 : Equip할 스킬의 슬롯이 존재하는지 판단

GetStatusFromAbilityTag 함수와 GetInputTagFromAbilityTag 함수의 로직은 위와 같다
인자로 받은 Tag에 해당하는 GASpec을 가져오고 해당 GASpec으로부터 적합한 정보를 반환한다

ServerEquipAbility 함수의 로직은 위와 같다
인자로 받은 Tag를 통해 Equip할 스킬의 GASpec을 가져오고 연관된 기존의 슬롯 정보를 제거한다
이후 인자로 받은 Slot Tag를 해당 GASpec에 추가하고, MarkAbilitySpecDirty 함수를 호출하여 변경을 기록한다

ClientEquipAbility 함수의 로직은 위와 같은데,
AbilityEquipped 델리게이트를 브로드캐스트하여 UI에 Equip한 스킬 어빌리티의 정보를 전파한다

ClearSlot 함수의 로직은 위와 같다
인자로 받은 GASpec에 저장된 InputTag를 제거하고 변경을 기록한다

ClearAbilitiesOfSlot 함수의 로직은 위와 같다
ScopedAbilityListLock 인스턴스를 생성하여 GA에 대한 동시성 문제를 제어한다
이후 발동가능한 GA를 순회하면서 인자로 넣어준 Slot Tag를 지닌 GASpec을 대상으로 ClearSlot 함수를 호출한다

AbilityHasSlot 함수의 로직은 위와 같다
인자로 넣어준 GASpec의 Tag를 순회하면서 인자로 넣어준 Slot Tag가 존재한다면 True를 반환한다
2 - 2) SpellMenuWidgetController 클래스

SpellGlobeReassignedSignature 델리게이트를 추가하여 스킬을 Equip하고 슬롯을 지정하면 브로드캐스트한다
인자로 Equip한 스킬 어빌리티의 Tag를 전파한다

추가한 델리게이트를 멤버변수로 추가한다

위와 같이 2개의 함수를 추가한다
- SpellRowGlobePressed 함수 : Equip한 스킬을 추가할 슬롯 UI를 선택하면 호출
- OnAbilityEquipped 함수 : 버튼 UI를 눌러 스킬 어빌리티를 Equip하면 호출

SelectedSlot 멤버변수를 추가하여 스킬 어빌리티를 추가할 슬롯 UI를 지정한다

BindCallbacksToDependencies 함수에 위의 로직을 추가한다
ASC의 AbilityEquipped 델리게이트에 OnAbilityEquipped 멤버함수를 바인드한다

SpellRowGlobePressed 함수의 로직은 위와 같다
캐싱되어 있는 선택된 스킬 어빌리티의 타입(Tag)를 가져오고 ASC의 ServerEquipAbility 함수에
스킬 어빌리티와 가져온 타입을 인자로 넘겨준다

OnAbilityEquipped 함수의 로직은 위와 같다
Equip한 스킬 어빌리티의 이전 슬롯 정보와 수정한 슬롯 정보를 각각 AbilityInfoDelegate 델리게이트로 전파한다
이어서 StopWaitingForEquipDelegate 델리게이트로 수정한 슬롯 정보를 통해 어빌리티 타입을 전파하고,
SpellGlobeReassignedDelegate 델리게이트에 Equip한 스킬의 Tag를 전파한다
이후, GlobeDeselect 함수를 호출하여 선택된 UI의 상태를 초기화한다

EquipButtonPressed 함수의 로직을 위와 같이 수정한다
캐싱되어 있는 선택된 스킬 어빌리티의 상태(Tag)를 가져오고 해당 스킬을 이미 장착한 상태라면,
해당 스킬의 슬롯(Tag)을 SelectedSlot 멤버변수에 저장한다
2 - 3) OverlayWidgetController 클래스


OnAbilityEquipped 함수의 로직은 위와 같다
스킬 어빌리티를 Equip한 이후에 해당 어빌리티의 이전 슬롯 정보와 현재 슬롯 정보를
각각 AbilityInfoDelegate 델리게이트를 통해 브로드캐스트한다

BindCallbacksToDependencies 함수에 위와 같이 로직을 추가한다
ASC의 AbilityEquipped 델리게이트에 OnAbilityEquipped 멤버함수를 바인드한다
- 블루프린트 사이드
1) BP_AuraGameInstance 블루프린트

기존의 GameMode에 저장한 정보를 위와 같이 GameInstance에 저장한다

프로젝트의 Game Instance Class 옵션을 위와 같이 수정한다
2) WBP_SpellGlobe_Button 위젯 블루프린트

WidgetControllerSet 이벤트의 2번째 시퀀스에 위와 같이 로직을 추가하여
SpellMenuWidgetController의 SpellGlobeReassignedSignature 델리게이트에 함수를 바인드한다
OnSpellGlobeReassigned 함수는 재설정된 스킬 UI에서 FX 효과를 재생한다
3) WBP_EquippedRow_Button 위젯 블루프린트

WidgetControllerSet 이벤트의 3번째 시퀀스에 위와 같이 로직을 추가하여
하위 UI의 OnClick 이벤트에 SpellMenuWidgetController 클래스의 SpellRowGlobePressed 함수를 바인드한다
4) 스킬창 UI를 구성하는 위젯 블루프린트


스킬창 UI를 구성하는 위젯 블루프린트에서 위와 같이 동일하게 Destruct 이벤트를 추가하여
델리게이트에 바인드한 이벤트들을 제거하는 로직을 추가한다
- 최종 실행 결과
'언리얼 엔진 - 게임 프로젝트 > GAS 프레임워크 RPG 프로젝트' 카테고리의 다른 글
| 전투 시스템 - 2) DamageEffectParams 구조체의 추가 & 사용 (0) | 2025.11.14 |
|---|---|
| 전투 시스템 - 1) 디버프 태그의 추가와 데미지 적용 방식 수정 (0) | 2025.11.13 |
| 스킬창 UI - 8) 스킬 타입 부여 (0) | 2025.11.08 |
| 스킬창 UI - 7) 스킬창 UI를 이용한 스킬의 정보 표현 (0) | 2025.11.07 |
| 스킬창 UI - 6) 스킬 포인트 사용 (0) | 2025.11.06 |