흔히 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 클래스 만들기
클래스 이름은 "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"선택
게임 실행!
'프로그래밍 이야기 > GameDev' 카테고리의 다른 글
[Unreal Engine] BluePrint - UMG 화면에 출력하기 (0) | 2021.09.08 |
---|---|
[자료구조] - 큐 (Queue) (0) | 2021.08.12 |
[Unreal Engine] WebBrowser Plugin 사용하기 (2) | 2021.05.13 |
[Unreal Engine] 프로젝트의 시작과 디버그 로그 출력 하기 (0) | 2021.05.12 |
[Unity] Unity에서 사용되는 특별한 경로 이름 (0) | 2021.02.01 |