본문 바로가기

게임프로그래밍/실습2

[실습2] 16. 유저 위젯과 위젯 컨트롤러 만들기

1. 서론

 

위젯과 데이터, HUD를 연결하기 위해 위젯 컨트롤러를 만들 것이다. 위젯에서 직접 데이터에 접근하고 HUD에서 직접 위젯에 접근하고 하면 나중에 이를 관리하기가 점점 힘들어진다.

 

그렇기에 위젯 컨트롤러를 만들 것이며 데이터는 컨트롤러에서 담당하고 위젯과 HUD는 그저 위젯 컨트롤러가 데이터를 넘겨주면 이를 반영하는 역할만 할 것이다.

 

컨트롤러의 경우 이러한 데이터를 브로드캐스팅하기 때문에 이 정보를 받는 위젯 클래스에 대해 알지 못한다. 반면 위젯 클래스는 데이터를 수신 받기 위해 컨트롤러에 대해 알아야 하니 단방향 의존성을 가지게 되고 이는 모듈화의 핵심이 된다.


2. 유저 위젯 클래스 만들기

 

 

유저위젯에서 사용할 커스텀 위젯 클래스를 만들어주자.

 

그 다음 유저 위젯 컨트롤러도 만들어주자.

 

 

위젯 컨트롤러가 따로 존재하지는 않는다. UObject 클래스를 만들고 이곳에서 기능들을 구현할 것이다.

 

이제 위젯 클래스를 구성해보자.

 

위젯 클래스에서 컨트롤러 클래스를 담을 변수를 만들어주어야 한다.

UCLASS()
class PRACTICE2_API UAuraUserWidget : public UUserWidget
{
    GENERATED_BODY()

public:
    UPROPERTY(BlueprintReadOnly)
    TObjectPtr<UObject> WidgetController;
    
};

 

위젯 컨트롤러를 만들어주면 이제 이 컨트롤러를 통해 위젯을 업데이트할 수 있을 것이다.

 

public:
    UFUNCTION(BlueprintCallable)
    void SetWidgetController(UObject* InWidgetController);

 

위젯을 설정할 수 있는 함수를 만들어주자.

 

void UAuraUserWidget::SetWidgetController(UObject* InWidgetController)
{
    WidgetController = InWidgetController;
    WidgetControllerSet();
}

 

위젯 컨트롤러를 가져오면 어떠한 작업들을 할 수 있을 것이다. 그러한 작업을 진행할 함수를 호출하였다.

 

protected:
    UFUNCTION(BlueprintImplementableEvent)
    void WidgetControllerSet();

 

해당 함수는 블루프린트에서 위젯 컨트롤러를 설정하고 그 후 작업을 진행할 수 있게 블루프린트 임플리멘터블 이벤트 함수로 만들었다.

 

이제 세터를 통해서 위젯 컨트롤러를 할당해주어야만 이후의 작업들을 할 수 있게 된다.

 


3. 위젯 컨트롤러 구성하기

 

이제 위젯 컨트롤러를 구성하자. 위젯 컨트롤러에는 각종 정보들이 있을 것이다.

 

UCLASS()
class PRACTICE2_API UAuraWidgetController : public UObject
{
    GENERATED_BODY()

protected:
    UPROPERTY(BlueprintReadOnly, Category="WidgetController")
    TObjectPtr<APlayerController> PlayerController;

    UPROPERTY(BlueprintReadOnly, Category="WidgetController")
    TObjectPtr<APlayerState> PlayerState;

    UPROPERTY(BlueprintReadOnly, Category="WidgetController")
    TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;

    UPROPERTY(BlueprintReadOnly, Category="WidgetController")
    TObjectPtr<UAttributeSet> AttributeSet;
    
};

 

위젯 컨트롤러는 네개의 주요 변수를 가지게 될 것이며 이를 통해 데이터를 주고 받을 수 있게 된다.

물론 이또한 단방향 의존성으로 변수로 설정한 클래스는 위젯 컨트롤러의 존재를 알지 못한다.

 

현재 변수들은 그저 존재하기만 하기 크게 의미있지는 않다. 나중에 실제로 값들을 할당하는 작업을 할 것이다.