본문 바로가기
언리얼_엔진_게임개발_공부/프로젝트

[슈터게임] 5. C++ 코드에서 UTextBlock 위젯의 폰트 / 아웃라인 변경 - UFont / FSlateFontInfo / FFontOutlineSettings

by jaboy 2025. 2. 26.

언리얼 엔진에 외부 폰트를 임포트하고 C++ 코드에서 FSlateFontInfo 구조체의 값을 지정해 폰트를 변경해보았다.

 

0. 외부 폰트를 사용하는 경우 .ttf / .otf 파일을 콘텐츠 브라우저에 드래그 앤 드롭하여 Font Face 에셋으로 추가한다. 단 원래 글꼴 파일이 프로젝트 폴더 내에 위치시키고 Font Face 에셋 내 파일 경로 또한 프로젝트 내의 글꼴파일을 가리키고 있는지 확인한다.

 

1. .콘텐츠 브라우저에서 우클릭 후 UFont 에셋을 생성했다.

 

2. 생성된 에셋을 더블클릭해 편집화면으로 들어간 후 + 클릭하여 아래와 같이 드롭다운 메뉴에서 해당 오브젝트와 연결될 Font Face 를 선택한다.

화면에 나온 것처럼 + 버튼으로 여러가지 글꼴을 하나의 Composite Font 에 추가하여 활용할 수 있다.

 

3. 위젯 클래스 C++ 코드 내에서 LoadObject<UObject> 함수로 폰트 오브젝트를 로드한다.

UItemNotificationWidget::UItemNotificationWidget(const FObjectInitializer& ObjectInitializer)
	: UUserWidget(ObjectInitializer)
{
//...
	// LoadObject<UObject> 로 에디터에서 생성한 폰트 오브젝트 로드
	RobotoItalic = LoadObject<UObject>(this, TEXT("/Game/UI/Fonts/Font_RobotoItalic.Font_RobotoItalic"));
}

 

4. 위에서 로드한 폰트 오브젝트로 FSlateFontInfo 구조체를 만든 후 UTextBlock 의 SetFont 함수에 인자로 넘긴다.

if (RobotoItalic)
{
	ItemNotificationTitle->SetFont(FSlateFontInfo(
		RobotoItalic, 24.f, NAME_None, FFontOutlineSettings(10.f, FLinearColor(1.f, 1.f, 1.f, 0.f))));
}

 

* FSlateFontInfo 의 여러가지 생성자 함수 중 아래와 같은 생성자를 활용했다.

FSlateFontInfo::FSlateFontInfo(
const UObject* InFontObject,
const float InSize,
const FName& InTypefaceFontName,
const FFontOutlineSettings& InOutlineSettings )

InTypefaceFontName 의 경우 특정 Typeface 

 

5. 폰트 아웃라인에 에디터에서 머티리얼을 넣었기에 위와 같이 컬러의 alpha 값이 0으로 지정된 FFontOutlineSettings 를 만들어 인자로 넘겼다.

 

* FFontOutlineSettings 의 생성자

	FFontOutlineSettings(int32 InOutlineSize, FLinearColor InColor = FLinearColor::Black)
		: OutlineSize(InOutlineSize)
		, bMiteredCorners(false)
		, bSeparateFillAlpha(false)
		, bApplyOutlineToDropShadows(false)
		, OutlineMaterial(nullptr)
		, OutlineColor(InColor)
	{}

 

 

6. 아웃라인 머티리얼의 경우 아래와 같은 SetFontOutlineMaterial 함수로 지정할 수 있다.

// 생성자에서 ConstructorHelpers::FObjectFinder 활용해 머티리얼 가져오기
ConstructorHelpers::FObjectFinder<UMaterialInstance> PurpleGlowMaterialFinder(
	TEXT("/Game/UI/Materials/MI_HUDGlowOutline_Purple.MI_HUDGlowOutline_Purple"));
if (PurpleGlowMaterialFinder.Succeeded())
{
	PurpleGlowMaterial = PurpleGlowMaterialFinder.Object;
}

//...

// SetFontOutlineMaterial 함수 활용해 머티리얼 지정하기
if (PurpleGlowMaterial)
{
	ItemNotificationTitle->SetFontOutlineMaterial(Cast<UMaterialInterface>(PurpleGlowMaterial));
}

* UMaterialInterface 은 말그대로 material 클래스들이 상속하는 인터페이스 클래스이다.

 

C++ 코드로 지정하는 방법을 알고 싶어서 이렇게 해보았지만, 에디터에서 클릭 몇 번으로 지정하는 것이 더 간편하다.

물론 폰트나 머티리얼의 로드/언로드 시점을 특정하고자 하는 경우 위와 같이 코드가 필요할 것이다.