UMG와 C++(UserWidget) 연동 시 사용하는 UPROERTY 키워드로는 BindWidget, BindWidgetOptional, BindWidgetAnim이 있다. 아래는 키워드 각각의 특징과 사용법을 정리하였다. UMG와 코드에서 선언한 변수를 연동할 때 상황에 맞는 키워드를 사용하자.

 

목차

     

     


     

     

    UMG와 C++(UserWidget) 연동 시 사용하는 UPROERTY 키워드


     

    UPROPERTY( meta = (BindWidget, BindWidgetOption, BindWidgetAnim)

     

    BindWidget

    이 메타데이터 태그는 주로 UMG(언리얼 모션 그래픽) 위젯 클래스에서 사용한다. 이 태그를 사용하면, 위젯 디자이너에서 생성된 위젯 요소를 해당 변수에 바인딩할 수 있다. 이를 통해 코드에서 위젯 요소를 직접 조작할 수 있다.


    BindWidgetOption

    이 메타데이터 태그는 BindWidget과 비슷한 역할을 하지만, 추가적인 옵션을 제공한다. 이 태그는 위젯 디자이너에서 생성된 위젯 요소가 반드시 존재해야 하는지, 아니면 선택적인지를 결정할 수 있다.


    BindWidgetAnim

    이 메타데이터 태그는 위젯 애니메이션에 사용된다. 위젯 디자이너에서 생성된 애니메이션을 코드에서 제어하기 위해 해당 애니메이션을 변수에 바인딩한다.

     

    	UPROPERTY(meta = (BindWidgetOptional))
    	class UImage* HighPingImage; // Ping이 높을때 나오는 이미지
    
    	UPROPERTY(meta = (BindWidgetAnim), Transient) // Transient는 직렬화 과정에서 무시되는 변수를 정의할 때 사용
    	UWidgetAnimation* HighPingAnimation;
    
    	UPROPERTY(meta = (BindWidget))
    	class UImage* WeaponImage; // 무기 이미지

     

    BindWidget

     

    BindWidget을 이용하면, C++에서 생성한 클래스를 상속받는 위젯 블루프린트(Widget Blueprint)에 변수를 연결하는 것이 가능하다.

    위젯 블루프린트 내부에는 클래스에서 선언한 이름과 같은 이름을 가진 위젯(=변수)이 존재해야 한다. 해당 위젯이 존재하면, 이를 위젯 포인터를 통해 코드에서 런타임에 접근한다.

    그러나, 해당 이름의 위젯이 없을 경우 위젯 블루프린트의 컴파일이 이루어지지 않는다.

     

     

    CharacterOverlay.h

    #pragma once
    #include "CoreMinimal.h"
    #include "Blueprint/UserWidget.h"
    #include "CharacterOverlay.generated.h"
    
    UCLASS(Blueprintable)
    class MULTIPLAYER_API UCharacterOverlay : public UUserWidget
    {
    	GENERATED_BODY()
        
    public:
    	UPROPERTY(meta = (BindWidget))
    	class UProgressBar* HealthBar; // 체력 바
    }

    코드에서 HealthBar이라고 선언한 변수를 위젯블루프린트에서 HealthBar1이라고 다른 이름으로 작성하면 binding 되지 않아 위와 같이 위젯블루프린트에서 컴파일 에러가 발생한다.


     

    BindWidgetOptional

     

    현업에서는 공동작업을 하기 때문에 이름이 변경되는 경우가 빈번히 발생한다. 이름이 변경될 때마다 컴파일 에러가 발생하면 매번 프로그래머에게 찾아오는 불상사가 생길 수 있다. 

     

    BindWidgetOptional를 사용하고 해당 이름을 못 찾았을때는 디버깅 메시지를 띄우게 만들 수 있다. 이렇게하면 디버깅 메시지로 잘못됐음을 파악할 수 있고 컴파일 에러는 발생하지 않아 작업은 계속해서 할 수 있다.

     

     

    CharacterOverlay.h

    #pragma once
    #include "CoreMinimal.h"
    #include "Blueprint/UserWidget.h"
    #include "CharacterOverlay.generated.h"
    
    UCLASS(Blueprintable)
    class MULTIPLAYER_API UCharacterOverlay : public UUserWidget
    {
    	GENERATED_BODY()
    public:
    	UCharacterOverlay(const FObjectInitializer& ObjectInitializer);
    
    	UPROPERTY(meta = (BindWidgetOptional))
    	class UProgressBar* HealthBar; // 체력 바
    }

     

    CharacterOverlay.cpp

    #include "CharacterOverlay.h"
    
    UCharacterOverlay::UCharacterOverlay(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
    {
    	if(HealthBar == nullptr)
    	{
    		GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("binding HealthBar is failed. Check WBP name to match HealthBar variable")));		
    	}
    }

     

    BindWidgetOptional를 사용하는 경우, 위와 같이 위젯 클래스에 생성자를 만들어 디버깅 메시지를 띄울 수 있도록 하는게 좋다.

    만약, 위젯블루프린트에서 잘못된 이름을 사용할 경우 아래와 같이 디버깅 메시지를 띄워준다.


    BindWidgetAnim

     

    BindWidgetAnim을 사용하면 위젯애니메이션도 binding하여 사용할 수 있다.

    이 때, UPROPERTY에 Transient 키워드를 붙여주어야 한다. Transient 키워드는 직렬화 과정에서 무시되는 변수를 정의할 때 사용

     

     

    CharacterOverlay.h

    #pragma once
    #include "CoreMinimal.h"
    #include "Blueprint/UserWidget.h"
    #include "CharacterOverlay.generated.h"
    
    UCLASS(Blueprintable)
    class MULTIPLAYER_API UCharacterOverlay : public UUserWidget
    {
    	GENERATED_BODY()
    public:
    	UPROPERTY(meta = (BindWidgetAnim), Transient) // Transient는 직렬화 과정에서 무시되는 변수를 정의할 때 사용
    	UWidgetAnimation* HighPingAnimation;
    }

     

    Transient 키워드를 붙이지 않으면 위와 같은 컴파일 에러가 발생한다.