[Unreal] UMG C++ 코드로 위젯 인터랙션 제작하기

박민주·2023년 1월 12일
1

Unreal

목록 보기
12/29

생성한 위젯 C++ 클래스에서 사용하기

  • TSubclassOf 사용
  • UUIMainHUD* 자료형 사용
protected:
	TSubclassOf<UUserWidget> MainHUDWidgetClass;
	UUIMainHUD* MainHUDWidget;
  • 게임모드 클래스의 생성자에서 블루프린트 클래스를 받아온 후 TSubclassOf 템플릿 클래스 객체에 넣어준다.
AMainGameMode::AMainGameMode()
{
	static ConstructorHelpers::FClassFinder<UUIMainHUD> MainHUDWidgetAsset(TEXT("WidgetBlueprint'/Game/UI/UI_MainHUD.UI_MainHUD_C'"));
	
    // TSubclassOf 템플릿 클래스 객체에 블루프린트 클래스를 넣어준다
	if (MainHUDWidgetAsset.Succeeded())
		MainHUDWidgetClass = MainHUDWidgetAsset.Class;
}
  • 이번에 실습했던 바와 비슷하게 BeginPlay에서 CreateWidget(), AddToViewport()를 해준다.
void AMainGameMode::BeginPlay()
{
	Super::BeginPlay();

	if (IsValid(MainHUDWidgetClass))
	{
		MainHUDWidget = Cast<UUIMainHUD>(CreateWidget(GetWorld(), MainHUDWidgetClass));

		if (IsValid(MainHUDWidget))
		{
			MainHUDWidget->AddToViewport();
		}
	}
}

위젯 인터랙션 제작하기

  • 버튼, 텍스트블록 등 접근할 위젯들을 UButton, UTextBlock 형의 변수로 선언한다.
  • TestButtonCallback()으느 블루프린트에서 버튼 이벤트에 연결해 줄 함수이므로 UFUNCTION(BlueprintCallable) 매크로를 달아준다.

헤더파일

class TextProject_API UUIMainHUD : public UUserWidget
{
	GENERATED_BODY()

protected:
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	class UButton* TestButton;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	class UTextBlock* TestTextBlock;

protected:
	virtual void NativeOnInitialized();
    
private:
	// 버튼을 눌렀을 때, 호출될 델리게이트에 등록할 함수
	UFUNCTION(BlueprintCallable)
	void TestButtonCallback();
}

소스코드

  • 위젯 블루프린트의 요소들을 이름을 통해 가져올 수 있다. (블루프린트에서 지정해준 이름)
  • OnClicked.AddDynamic()을 통해 델리게이트에 함수를 등록할 수 있다.
    블루프린트에서 이벤트에 등록하는 대신 이런 식으로 코드에서 할 수 있다.
#include "UIMainHUD.h"
#include "Components/Button.h"
#include "Components/TextBlock.h"

// 위젯 클래스의 생성자
void UUIMainHUD::NativeOnInitialized()
{
	Super::NativeOnInitialized();

	// 위젯 블루프린트의 버튼을 이름을 통해 가져온다
	TestButton = Cast<UButton>(GetWidgetFromName(TEXT("TestButton")));
    
    // 위젯 블루프린트의 텍스트 블록을 이름을 통해 가져온다
	TestTextBlock = Cast<UTextBlock>(GetWidgetFromName(TEXT("TestTextBlock")));

	// 버튼 클릭시 호출될 델리게이트에 함수를 등록한다
	TestButton->OnClicked.AddDynamic(this, &UUIMainHUD::TestButtonCallback);
}

void UUIMainHUD::TestButtonCallback()
{
	// 버튼이 눌렸을때 실행될 내용 구현
}

참고

https://jhtop0419.tistory.com/33

profile
Game Programmer

1개의 댓글

comment-user-thumbnail
2024년 4월 13일

감사합니다..... 한 줄기 빛이 되어주셨네요 ㅠㅠ

답글 달기