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) 위젯에 위젯 컨트롤러 연결하기