1. AuraHUD에 변수 추가
AuraHUD에 스펠 메뉴 위젯 컨트롤러와 스펠 메뉴 위젯 컨트롤러 블루프린트 클래스의 변수를 추가한다.
UPROPERTY()
TObjectPtr<USpellMenuWidgetController> SpellMenuWidgetController;
UPROPERTY(EditAnywhere)
TSubclassOf<USpellMenuWidgetController> SpellMenuWidgetControllerClass;
USpellMenuWidgetController* GetSpellMenuWidgetController(const FWidgetControllerParams& WCParams);
USpellMenuWidgetController* AAuraHUD::GetSpellMenuWidgetController(const FWidgetControllerParams& WCParams)
{
if (SpellMenuWidgetController == nullptr)
{ // 없으면 생성
SpellMenuWidgetController = NewObject<USpellMenuWidgetController>(this, SpellMenuWidgetControllerClass);
SpellMenuWidgetController->SetWidgetControllerParams(WCParams);
SpellMenuWidgetController->BindCallbacksToDependencies();
}
return SpellMenuWidgetController;
}
블루프린트 클래스를 가져와 객채를 생성하고 해당 객체에 파라미터를 넘긴다.
이후 종속된 델리게이트에 대해 바인딩을 실시한다.
2. AuraAbilitySystemLibrary에서 스펠 메뉴 위젯 컨트롤러의 Getter 함수 선언
UFUNCTION(BlueprintPure, category = "AuraAbilitySystemLibrary|WidgetController")
static USpellMenuWidgetController* GetSpellMenuWidgetController(const UObject* WorldContextObject);
USpellMenuWidgetController* UAuraAbilitySystemLibrary::GetSpellMenuWidgetController(const UObject* WorldContextObject)
{
// 로컬 플레이어의 컨트롤러 가져오기
if (APlayerController* PC = UGameplayStatics::GetPlayerController(WorldContextObject, 0))
{
if (AAuraHUD* AuraHUD = Cast<AAuraHUD>(PC->GetHUD()))
{
// 위젯 컨트롤러 파라미터 구조체 생성
AAuraPlayerState* PS = PC->GetPlayerState<AAuraPlayerState>();
UAbilitySystemComponent* ASC = PS->GetAbilitySystemComponent();
UAttributeSet* AS = PS->GetAttributeSet();
const FWidgetControllerParams Params(PC, PS, ASC, AS);
return AuraHUD->GetSpellMenuWidgetController(Params);
}
}
return nullptr;
}
있으면 가져오고 없으면 생성하는 Getter 함수이다.
3. AuraAbilitySystemLibrary 코드 리펙토링
위의 Getter 함수에 반복적으로 쓰이는 구문을 함수로 리펙토링한다.
public:
UFUNCTION(BlueprintPure, category = "AuraAbilitySystemLibrary|WidgetController")
static bool MakeWidgetControllerParams(const UObject* WorldContextObject, FWidgetControllerParams& OutWCParams, AAuraHUD*& OutAuraHUD);
- OutWCParams는 정보를 채워서 내보낼 파라미터이다.
- OutAuraHUD는 AuraHUD의 포인터를 채워서 내보낼 AAuraHUD 포인터의 참조이다.
bool UAuraAbilitySystemLibrary::MakeWidgetControllerParams(const UObject* WorldContextObject, FWidgetControllerParams& OutWCParams, AAuraHUD*& OutAuraHUD)
{
// 로컬 플레이어의 컨트롤러 가져오기
if (APlayerController* PC = UGameplayStatics::GetPlayerController(WorldContextObject, 0))
{
OutAuraHUD = Cast<AAuraHUD>(PC->GetHUD());
if (OutAuraHUD)
{
// 위젯 컨트롤러 파라미터 구조체 생성
AAuraPlayerState* PS = PC->GetPlayerState<AAuraPlayerState>();
UAbilitySystemComponent* ASC = PS->GetAbilitySystemComponent();
UAttributeSet* AS = PS->GetAttributeSet();
// 내보내는 파라미터
OutWCParams.AttributeSet = AS;
OutWCParams.AbilitySystemComponent = ASC;
OutWCParams.AttributeSet = AS;
OutWCParams.PlayerState = PS;
return true;
}
}
return false;
}
함수 타입이 불리언이므로 이 함수를 사용하는 다른 함수에서 유효성을 검증할 수 있다.
UOverlayWidgetController* UAuraAbilitySystemLibrary::GetOverlayWidgetController(const UObject* WorldContextObject)
{
FWidgetControllerParams WCParams;
AAuraHUD* AuraHUD = nullptr;
if (MakeWidgetControllerParams(WorldContextObject, WCParams, AuraHUD))
{
return AuraHUD->GetOverlayWidgetController(WCParams);
}
return nullptr;
}
빈 WidgetControllerParams 구조체와 AuraHUD 포인터를 생성하여 넘겨서 채워준다.
아웃 파라미터 두 개를 이용하여 HUD에서 위젯 컨트롤러를 가져오게 한다.
4. 스펠 메뉴 위젯 컨트롤러 블루프린트
(1) 스펠 메뉴 위젯 컨트롤러 블루프린트 생성
- 블루프린트 생성 시 SpellMenuWidgetController 클래스가 보이지 않는다면
스펠 메뉴 위젯 컨트롤러의 UCLASS 매크로 설정을 확인한다.
UCLASS(BlueprintType, Blueprintable)
class AURA_API USpellMenuWidgetController : public UAuraWidgetController
{
어빌리티 정보가 AuraWidgetController로 옮겨졌으므로 자식 클래스인 이 클래스에도 어빌리티 정보를 설정해야한다.
(2) BP_AuraHUD에 스펠 메뉴 위젯 컨트롤러 클래스 지정
생성한 블루프린트 클래스를 AuraHUD에 지정한다.
(3) 블루프린트 라이브러리에서 스펠 메뉴 위젯 컨트롤러 Getter 수정 - meta, DefaultToSelf
이 Getter 함수 노드를 사용할 때마다 World Context Object를 지정하여야하는 번거로움을 줄이기 위해 해당 함수의 기본값을 this(블루프린트에서 self)로 지정하도록 수정한다.
UFUNCTION(BlueprintPure, category = "AuraAbilitySystemLibrary|WidgetController", meta = (DefaultToSelf = "WorldContextObject"))
static bool MakeWidgetControllerParams(const UObject* WorldContextObject, FWidgetControllerParams& OutWCParams, AAuraHUD*& OutAuraHUD);
meta 속성의 DefaultToSelf 옵션을 사용하면 해당 매개변수의 기본값을 Self로 지정하게 된다.
블루프린트 라이브러리의 다른 Getter 함수들에 위의 옵션을 작성해준다.
(4) 위젯에 위젯 컨트롤러 연결하기
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
22-8. 스펠 메뉴 UI - (8) 어빌리티 상태(Ability Status) - 게임플레이 태그 (0) | 2025.02.05 |
---|---|
22-7. 스펠 메뉴 UI - (7) 스펠이 장착된 버튼 (0) | 2025.02.04 |
22-5. 스펠 메뉴 UI - (5) 스펠 장착 버튼, 위젯 컨트롤러 리펙토링 (0) | 2025.01.23 |
22-4. 스펠 메뉴 UI - (4) 메뉴 앵커를 활용한 팝업 메뉴 (0) | 2025.01.22 |
22-3. 스펠 메뉴 UI - (3) 스펠 메뉴 위젯, 스펠 설명 박스 (0) | 2025.01.22 |