UE 5 스터디/Gameplay Ability System(GAS)

22-22. 스펠 메뉴 UI - (22) 오버레이에 반영하기, 디버그, 폴리싱

Crat3 2025. 2. 19. 17:56

0. 개요

스펠 메뉴에서 어빌리티(스펠)을 다른 슬롯에 장착하는 기능을 구현했다.

이제 이 기능이 정상적으로 작동하고 오버레이에 반영되도록 수정한다.

 

 

1. 오버레이에 반영하기

(1) 오버레이 위젯 컨트롤러에서 델리게이트 재사용, 바인딩

AuraASC에서 만든 델리게이트를 스펠 메뉴 위젯 컨트롤러에서 사용했던 것처럼, 해당 델리게이트를 오버레이 위젯 컨트롤러에서 사용할 것이다.

void UOverlayWidgetController::BindCallbacksToDependencies()
{
//~~~~~~~~~~~~~~~~~~~~~~~
    if (GetAuraASC())
    {
        GetAuraASC()->AbilityEquipped.AddUObject(this, &UOverlayWidgetController::OnAbilityEquipped);

 

 

(2) 콜백 함수

// 어빌리티 장착 표시
void OnAbilityEquipped(const FGameplayTag& AbilityTag, const FGameplayTag& Status, const FGameplayTag& Slot, const FGameplayTag& PrevSlot);
void UOverlayWidgetController::OnAbilityEquipped(const FGameplayTag& AbilityTag, const FGameplayTag& Status, const FGameplayTag& Slot, const FGameplayTag& PrevSlot)
{
    const FAuraGameplayTags& GameplayTags = FAuraGameplayTags::Get();

    FAuraAbilityInfo LastSlotInfo;
    LastSlotInfo.StatusTag = GameplayTags.Abilities_Status_Unlocked;
    LastSlotInfo.InputTag = PrevSlot;
    LastSlotInfo.AbilityTag = GameplayTags.Abilities_None;

    // 변경할 슬롯에 이미 어빌리티가 있다면 빈 어빌리티 정보를 보냄
    AbilityInfoDelegate.Broadcast(LastSlotInfo);

    // 변경할 슬롯에 선택한 어빌리티의 정보를 채움
    FAuraAbilityInfo Info = AbilityInfo->FindAbilityInfoForTag(AbilityTag);
    Info.StatusTag = Status;
    Info.InputTag = Slot;
    AbilityInfoDelegate.Broadcast(Info);
}

 

 

2. 디버그

(1) 스펠을 장착하면 다른 슬롯의 스펠의 이미지가 초기화되는 현상

WBP_EquippedRow_Button - 장착 행 버튼의 이벤트 그래프를 수정한다.

이미 장착된 어빌리티에 대해서만 Clear Globe 함수를 호출하여야 하므로 브랜치 순서를 변경한다.

 

 

(2) 오버레이에서 이미지가 하얗게 표시됨

스펠 메뉴에서 스펠을 다시 장착하면 오버레이의 스펠 체력 마나 위젯의 글로브의 이미지가 하얗게 표시된다.

WBP_SpellGlobe의 Receive Ability Info 함수를 수정한다.

 

 

(3) 쿨타임이 정상적으로 표기되지 않고 하얗게 나타남

글로브가 변경되었을 때 쿨타임 태그도 제거해야 한다.

 

 

3. 폴리싱

스펠을 장착한 이후에 자동으로 글로브 선택을 해제하고 사운드를 재생하게 한다.

 

(1) 블루프린트 델리게이트 선언

스펠 메뉴 위젯 컨트롤러에서 델리게이트를 선언한다.

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSpellGlobeReassignedSignature, const FGameplayTag&, AbilityTag);
	UPROPERTY(BlueprintAssignable)
	FSpellGlobeReassignedSignature SpellGlobeReassignedDelegate;

 

 

(2) 델리게이트 호출

void USpellMenuWidgetController::OnAbilityEquipped(const FGameplayTag& AbilityTag, const FGameplayTag& Status, const FGameplayTag& Slot, const FGameplayTag& PrevSlot)
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// 장착 행 강조 애니메이션 중단
	StopWaitForEquipDelegate.Broadcast(AbilityInfo->FindAbilityInfoForTag(AbilityTag).AbilityType);
	
	// 스펠 글로브 재지정 델리게이트 호출
	SpellGlobeReassignedDelegate.Broadcast(AbilityTag);
	GlobeDeselect();
}

어빌리티를 새로운 슬롯에 장착하는 함수에서 이 델리게이트를 호출한다.

 

 

(3) WBP_SpellGlobe_Button 블루프린트에서 함수 바인딩

두 어빌리티의 태그가 일치하면 선택 링을 해제하고 사운드를 출력한다.

Selected 불리언을 False로 만들어야 선택 해제 사운드가 출력되지 않는다.