프로그래밍 이야기/GameDev

[Unreal Engine] Slate 사용의 시작

Mulder5 2021. 7. 29. 00:59
반응형

흔히 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"선택

 

게임 실행!

반응형