0. 개요

이전 포스트에서 블루프린트 함수 라이브러리를 생성했다.

이제 속성 메뉴에 정보를 넘기기 위한 위젯 컨트롤러를 생성하고 라이브러리에서 Getter 함수를 만든다.

 

 

1. HUD에서 위젯 컨트롤러 관리하기 - AuraHUD

(1) 코드

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/HUD.h"
#include "AuraHUD.generated.h"

class UAuraUserWidget;
class UOverlayWidgetController;
class UAttributeMenuWidgetController;
class UAbilitySystemComponent;
class UAttributeSet;
struct FWidgetControllerParams;
/**
 * 
 */
UCLASS()
class AURA_API AAuraHUD : public AHUD
{
	GENERATED_BODY()

public:

	UOverlayWidgetController* GetOverlayWidgetController(const FWidgetControllerParams& WCParams);
	UAttributeMenuWidgetController* GeAttributeMenuWidgetController(const FWidgetControllerParams& WCParams);

	void InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS);
	void InitAttributeMenu(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS);

private:
	UPROPERTY()
	TObjectPtr<UAuraUserWidget> OverlayWidget;

	UPROPERTY(EditAnywhere)
	TSubclassOf<UAuraUserWidget> OverlayWidgetClass;

	UPROPERTY(EditAnywhere)
	TSubclassOf<UOverlayWidgetController> OverlayWidgetControllerClass;

	UPROPERTY()
	TObjectPtr<UOverlayWidgetController> OverlayWidgetController;
	
	UPROPERTY()
	TObjectPtr<UAttributeMenuWidgetController> AttributeMenuWidgetController;

	UPROPERTY(EditAnywhere)
	TSubclassOf<UAttributeMenuWidgetController> AttributeMenuWidgetControllerClass;
};

속성 메뉴 위젯 컨트롤러를 구성하기 위해 해당 컨트롤러의 포인터를 멤버 변수로 저장하고, 블루프린트에서 클래스를 지정한다.

UAttributeMenuWidgetController* AAuraHUD::GeAttributeMenuWidgetController(const FWidgetControllerParams& WCParams)
{
    if (AttributeMenuWidgetController == nullptr)
    {   // 없으면 생성
        AttributeMenuWidgetController = NewObject<UAttributeMenuWidgetController>(this, OverlayWidgetControllerClass);
        AttributeMenuWidgetController->SetWidgetControllerParams(WCParams);
        AttributeMenuWidgetController->BindCallbacksToDependencies();
    }

    return AttributeMenuWidgetController;
}

오버레이 메뉴 위젯 컨트롤러와 동일하게 이미 존재하면 반환하고, 존재하지 않으면 생성하여 반환하도록 설정한다.

 

 

2. 블루프린트 함수 라이브러리에 속성 메뉴 위젯 컨트롤러 Getter 추가하기

(1) 라이브러리에 Getter 생성

UCLASS()
class AURA_API UAuraAbilitySystemLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
	
public:
	UFUNCTION(BlueprintPure, category="AuraAbilitySystemLibrary|WidgetController")
	static UOverlayWidgetController* GetOverlayWidgetController(const UObject* WorldContextObject);

	UFUNCTION(BlueprintPure, category = "AuraAbilitySystemLibrary|WidgetController")
	static UAttributeMenuWidgetController* GetAttributeMenuWidgetController(const UObject* WorldContextObject);
};
UAttributeMenuWidgetController* UAuraAbilitySystemLibrary::GetAttributeMenuWidgetController(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->GetAttributeMenuWidgetController(Params);
		}
	}
	return nullptr;
}

 

 

(2) UCLASS 속성 수정 - AttributeMenuWidgetController

이제 컴파일을 실행하고 디버그를 해보면 속성 메뉴 위젯 컨트롤러를 상속할 수 없다.

이는 해당 클래스의 UCLASS 속성이 BlueprintType, Blueprintable로 지정되어있지 않기 때문이다.

UCLASS(BlueprintType, Blueprintable)
class AURA_API UAttributeMenuWidgetController : public UAuraWidgetController
{
	GENERATED_BODY()
	
public:
	virtual void BroadcastInitialValues();
	virtual void BindCallbacksToDependencies();
};

이제 블루프린트를 생성하면 올바르게 상속받을 수 있다.

 

 

3. AuraHUD에서 디테일 창에서 클래스 지정

이제 AuraHUD의 블루프린트에서 위젯 컨트롤러의 클래스를 올바르게 지정한다.

 

 

4. 위젯에 위젯 컨트롤러 연결하기

모든 위젯은 위처럼 위젯 컨트롤러에 대한 포인터를 가지고 있다.

SetWidgetController를 통해 이전에 생성한 위젯 컨트롤러를 위젯 내의 포인터로 저장하여 사용할 것이다.

 

 

(1) WBP_AttributeMenu

기존의 Construct 이벤트에 위젯 컨트롤러를 새롭게 생성한 속성 메뉴 위젯 컨트롤러를 연결하도록 한다.

 

 

(2) 위젯 컨트롤러 연결 확인하기

위젯 컨트롤러 Set 이벤트 노드를 사용하면 정상적으로 위젯 컨트롤러가 설정되었는지 확인할 수 있다.