본문 바로가기
프로그래밍 이야기/GameDev

[Unreal Engine] Slate 사용의 시작

by Mulder5 2021. 7. 29.
반응형

흔히 Unreal Engine에서 UMG를 사용하지만 UI코드를 완전히 게임과 분리 하기 위해서 이번 미니 프로젝트에서는 Slate 기반의 모듈을 만들었다. Slate를 사용하면 온전히 코드만으로 UI 레이아웃과 UI 구현체 모두를 구현 할 수 있기 때문에 가능한 것이다.

Slate로 UI를 그리고 출력하기 위한 기본적인 방법에 대해서 알아보겠다.

프로젝트 생성

나는 HelloSlate라는 이름으로 프로젝트를 만들었다. 

빌드 스크립트 수정 (HelloSlate.Build.cs)

프로젝트 상에서 Slate를 사용할 수 있도록 "Slate", "SateCore" 모듈을 포함 시켜준다.



 

VS 프로젝트 파일 재 생성 하기

Visual Studio와 Editor를 닫고 HelloSlate.uproject 파일을 우클릭하여 "Generate Visual Studio project files"를 실행한 다음, Visual Studio Solution(HelloSlate.sln) 과 Unreal 프로젝트를 연다. 

 

HUD 클래스 만들기

Content Browser에서 우클릭 New C++ Class
Show All Classes > HUD 선택

클래스 이름은 "StandardHud"로 한다.

 

SlateCompoundWidget 클래스 만들기

SlateCompoundWidget클래스는 Content Browser에서 만들 수 없으므로 Visual Studio에서 수동으로 만들어준다. 클래스 이름은 "StandardSlateWidget"으로 한다.

각 파일의 구현

StandardHud.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/HUD.h"
#include "StandardHUD.generated.h"

class SStandardSlateWidget;

UCLASS()
class HELLOSLATE_API AStandardHUD : public AHUD
{
	GENERATED_BODY()

public:
	
	TSharedPtr<SStandardSlateWidget> MySlateWidget;

	void BeginPlay();
	
};

 

StandardHud.cpp

#include "StandardHUD.h"
#include "StandardSlateWidget.h"

#include "Widgets/SWeakWidget.h" 
#include "Runtime/Engine/Classes/Engine/Engine.h" 


void AStandardHUD::BeginPlay()
{
	MySlateUIWidget = SNew(SStandardSlateWidget).OwnerHUDArg(this);
    
	GEngine->GameViewport->AddViewportWidgetContent(
		SNew(SWeakWidget)
		.PossiblyNullContent(MySlateUIWidget.ToSharedRef())
	);

	MySlateUIWidget->SetVisibility(EVisibility::Visible);

}

 

StandardSlateWidget.h

#pragma once

#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"


class HELLOSLATE_API SStandardSlateWidget : public SCompoundWidget
{
public:
	SLATE_BEGIN_ARGS(SStandardSlateWidget)
	{}
	SLATE_ARGUMENT(TWeakObjectPtr<class AStandardHUD>, OwnerHUDArg);
	SLATE_END_ARGS()

private:
	TWeakObjectPtr<class AStandardHUD> OwnerHUD;

};

 

StandardSlateWidget.cpp

#include "StandardSlateWidget.h"
#include "SlateOptMacros.h"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION

#define LOCTEXT_NAMESPACE "SStandardSlateWidget"

void SStandardSlateWidget::Construct(const FArguments& InArgs)
{
	OwnerHUD = InArgs._OwnerHUDArg;

	ChildSlot
		.VAlign(VAlign_Fill)
		.HAlign(HAlign_Fill)
		[
			SNew(SOverlay)
			+ SOverlay::Slot()
		.VAlign(VAlign_Top)
		.HAlign(HAlign_Center)
		[
			SNew(STextBlock)
			.ShadowColorAndOpacity(FLinearColor::Black)
		.ColorAndOpacity(FLinearColor::Blue)
		.ShadowOffset(FIntPoint(-1, 1))
		.Font(FSlateFontInfo("Veranda", 16))
		.Text(LOCTEXT("HelloSlateText", "Hello, Slate!"))
		]
		];

}

#undef LOCTEXT_NAMESPACE

END_SLATE_FUNCTION_BUILD_OPTIMIZATION

 

GameMode 구현

HelloSlateGameModeBase 클래스를 다음과 같이 수정한다.

HelloStateGameModeBase.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "HelloSlateGameModeBase.generated.h"

UCLASS()
class HELLOSLATE_API AHelloSlateGameModeBase : public AGameModeBase
{
	GENERATED_BODY()
public:
	AHelloSlateGameModeBase();
};

 

HelloStateGameModeBase.cpp

#include "HelloSlateGameModeBase.h"
#include "StandardHUD.h"

AHelloSlateGameModeBase::AHelloSlateGameModeBase()
{
	HUDClass = AStandardHUD::StaticClass();
}

 

Editor에서 기본 GameMode 설정하기

Edit Menu > Project Settings 선택

Project > Maps & Mode > Default Game Mode 를 다음과 같이 설정해준다. 
"HelloStlateGameModeBase"선택

 

게임 실행!

반응형