본문 바로가기
Unreal/Manual

Unreal Widget Component TextBlock 사용하기

by Dev_카페인 2023. 12. 28.
반응형

[Unreal/C++] Widget Component TextBlock 사용하기

 

Unreal Engine (UE) TextBlock Widget Change Text WidgetComponent

 

이 글에서는 언리얼 엔진에서 텍스트박스를 적 위에 두고 이름을 표시합니다.

 

 

먼저 위젯 블루프린트를 만들어 줍니다.

SizeBox와 TextBlock를 차례로 추가합니다.

SizeBox는 너비와 높이를 오버라이드 하여 크기를 설정해줍니다.

TextBlock는 이름을 설정해 줍니다. 이 이름은 C++ 코드에서 변수의 이름으로 사용할 예정이기 때문에 변수 여부에 체크해주고 적절한 이름으로 정합니다.

가운데 정렬을 해주고 필요시 컬러와 폰트 크기를 설정해줍니다.

 

 

 클래스가 만들어지면 위젯 블루프린트에서 부모 클래스를 생성한 클래스로 변경해주어야 합니다.

이제 UserWidget을 상속받는 C++ 클래스를 만들어 주고 코드를 작성합니다.

 

필요시 블루프린트에서 읽을 수 있도록 ReadOnly 설정을 해주고 meta = (BindWidget)으로 위젯 블루프린트의 TextBlock와 연결해줍니다.

UTextBlock를 사용하기 위해서는 #include "Components/TextBlock.h" 헤더를 추가합니다.

위젯 헤더 파일에서는 전방선언으로 작업해줍니다.

// MyWidget.h
#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "EnemyNameTag.generated.h"

class UTextBlock;

UCLASS()
class MAINPROJECT_API UEnemyNameTag : public UUserWidget
{
	GENERATED_BODY()
	
public :
	void SetNameTag(FText InName);

protected :
	UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
		UTextBlock* NameTag;
};
// MyWidget.cpp

#include "Enemy/Widgets/EnemyNameTag.h"

#include "Components/TextBlock.h"

void UEnemyNameTag::SetNameTag(FText InName)
{
	NameTag->SetText(InName);
}

Text를 바꿀 수 있게 함수를 하나 만들었으며 TextBlock의 Text 변경은 지역화를 위해 FText를 받습니다.

SetText로 변경 시 바인딩된 델리게이트가 해제되는 것은 참고로 알고 있으면 좋습니다.

 

 

적 캐릭터에서 생성한 위젯 클래스를 추가해 줍니다.

먼저 알고 있어야 할 것은 캐릭터의 HUD가 아닌 월드상 위젯은 WidgetComponent를 이용해 띄울 수 있습니다.

 

WidgetComponent는 아래와 같이 생성할 수 있습니다.

코드상으로 추가할 예정이기 때문에 컴포넌트는 블루프린트에서 생성할 필요가 없습니다.

바꿀 속성을 미리 확인합니다.

Space는 월드 상에 나타낼지 스크린에 보이도록 할지 정합니다.

Screen으로 설정할 경우 뷰포트에는 보이지 않습니다.

위젯 클래스는 생성한 위젯 블루프린트 클래스로 지정해줍니다.

드로 사이즈는 화면 상에 나타날 크기를 지정해줍니다.

 

위 속성들을 미리 확인하고 코드를 작성합니다.

 

해당 적 캐릭터 클래스에서 위젯 컴포넌트를 선언합니다.

생성자에서 위젯 컴포넌트를 생성해 주고 Mesh 컴포넌트 하위에 종속시켜줍니다.

마찬가지로 생성자에서 생성한 클래스를 가져옵니다. 이때 위젯 블루프린트에서 부모변경을 했는지 다시 한 번 확인할 필요가 있습니다.

위젯 블루프린트의 레퍼런스를 복사하여 붙여 넣는데 끝에 _C를 붙여 블루프린트 클래스임을 명시해줍니다.

나머지 속성또한 지정해줍니다.

 

BeginPlay에서 WidgetComponent의 InitWidget()을 호출해줍니다.

호출하지 않아도 정상적으로 동작은 하지만 가끔 초기화가 되지 않아 실행시 보이지 않습니다.

설정했던 SetNameTag함수를 호출하기 위해 Cast를 통해 설정할 수 있습니다.

변수를 하나 생성하여 가지고 있어도 무방하지만, 단 한 번의 변경을 위해 가지고 있는 것은 메모리가 아깝습니다.

 

반응형