게임내 슬레이트 사용하기

게임내 유저 인터페이스에 Slate UI 위젯 사용하기 입니다.

Windows
MacOS
Linux

Slate (슬레이트) 위젯은 게임내에서 HUD 나 메뉴같은 기타 UI 요소를 만드는 데 사용할 수 있습니다. 일반적으로는 하나 이상의 컨테이너 위젯을 만들며, 그 각각은 UI 의 특정 부분을 담당하는 여러가지 유형의 위젯으로 구성될 수 있습니다.

예를 들어 게임 HUD 에 하나의 커다란 위젯이, 메인 메뉴, 옵션 메뉴, 일시정지 메뉴, 점수판 등에 여러개의 위젯이 있을 수 있습니다. 여기서 이들 위젯 각각은 여러가지 커스텀 위젯, 라벨, 텍스트 박스, 이미지, 기타 엘리먼트 유형의 조합으로 만들 수도 있을 것입니다.

그 후 이들 컨테이너 위젯 각각을 게임 내 상황에 따라 추가 또는 제거하면 됩니다:

  • 게임이 시작되면 메인 메뉴 위젯이 추가됩니다.

  • 메뉴의 옵션 중 하나를 선택하면, 이를테면 게임 시작을 선택했다면 메인 메뉴 위젯이 제거됩니다.

  • 일정 시점에서 플레이어가 게임을 일시정지시킨 경우, 일시정지 메뉴 위젯이 추가됩니다.

  • 게임이 재개되면 일시정지 메뉴 위젯이 제거됩니다.

  • 플레이어의 HUD 가 초기화되면, HUD 위젯이 추가됩니다.

프로젝트 셋업

Slate UI (슬레이트 유저 인터페이스) 프레임워크를 사용하기 위해서는, 프레임워크를 인식할 수 있도록 프로젝트 셋업을 해 줘야 합니다. 이로써 Slate.h 헤더 인클루드 및 슬레이트로 UI 를 만드는 데 있어 필요한 여러가지 프레임워크 요소 참조이 가능합니다.

모듈 종속성

슬레이트 프레임워크는 몇 개의 모듈에 저장됩니다. 프로젝트에 인식시켜주기 위해서는, 몇가지 종속성 셋업을 프로젝트의 *.build.cs 파일에서 해 줘야 합니다.

프로젝트에서 접근해야 하는 모듈은:

모듈

종속성 유형

InputCore

Public

Slate

Private

SlateCore

Private

슬레이트 모듈 종속성 셋업을 위해서는:

  1. 프로젝트의 [ProjectName].build.cs 파일을 엽니다. 그 위치는 [ProjectDir]/[ProjectName]/Source/[ProjectName] 입니다.

  2. PublicDependencyModuleNames"InputCore" 를 추가하여 InputCore public 종속성을 추가합니다.

    PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

    InputCore 모듈은 코드 프로젝트 생성시 기본적으로 public 종속성으로 설정되어 있습니다.

  3. Slate, SlateCore private 종속성을 추가합니다. *.build.cs 파일에 private 종속성 추가를 위한 한 줄이 있습니다:

    PrivateDependencyModuleNames.AddRange(new string[] {  });

    SlateCore, Slate 모듈을 그 줄에 추가합니다:

    PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

    프로젝트를 언제 만들었는지, 사용한 엔진 버전은 무엇인지에 따라 이미 *.build.cs 파일에 Slate 종속성 셋업이 되어있으되 코멘트 처리되어 있을 수가 있습니다. 그에 해당하는 줄의 코멘트를 없애주기만 해도 종속성 셋업이 됩니다!

    // Uncomment if you are using Slate UI
    // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

위젯 표시

게임에 슬레이트 위젯을 표시하기 위해서는, 게임의 뷰포트에 추가해 줘야 합니다. 오버레이된 위젯은 추가시 지정된 Z 순서 (Z-order) 값에 따라 순서가 정해지는데, Z 순서 값이 큰 것이 작은 것 위에 그려집니다.

게임 뷰포트 접근

게임의 뷰포트는 GameViewportClient 클래스의 인스턴스입니다. 현재 게임 뷰포트로의 레퍼런스는 UEngine 멤버인 GameViewport 를 통해 가능하며, 이것은 게임에 대한 현재 UEngine 인스턴스로의 GEngine 글로벌 포인터를 사용하여 접근 가능합니다.

예:

GEngine->GameViewport

GEngineGameViewportNULL 일 수 있으므로 이들이나 그 멤버에 접근하기 전 반드시 그 값을 확인해야 합니다.

뷰포트에 위젯 추가

뷰포트에 슬레이트 위젯을 추가하려면 위젯으로의 레퍼런스, 정확히는 TSharedref<SWidget>GameViewportClient::AddViewportWidgetContent() 에 전달하면 됩니다. 이 함수는 위젯과 Z 순서값 둘 다 받아들이는데, 앞서 말했듯이 새로운 위젯에 대한 소트 순서를 나타냅니다. Z 순서는 옵션이긴 하지만 기본값은 0 입니다.

뷰포트에 추가하려는 위젯으로의 레퍼런스는 HUD 와 같은 클래스의 멤버로 저장 가능하며, 또는 함수 호출 시점에서 생성하여 전달해주는 것도 가능합니다.

멤버 변수에 (TSharedPtr 로) 저장된 위젯으로의 레퍼런스 전달:

GEngine->GameViewport->AddViewportWidgetContent(
    SNew(MyWidgetPtr.ToSharedRef())
);

그것을 GameViewportClient::AddViewportWidgetContent() 에 전달시 SNew() 로 위젯 생성:

GEngine->GameViewport->AddViewportWidgetContent(
    SNew(SWeakWidget)
    .PossiblyNullContent(MyWidgetClass)
); 

혹은 SAssignNew() 로 생성, TSharedPtr 멤버에 할당한 다음 전달해 줍니다:

GEngine->GameViewport->AddViewportWidgetContent(
    SAssignNew(MyWidgetPtr, SWeakWidget)
    .PossiblyNullContent(MyWidgetClass)
);

뷰포트에서 위젯 제거

뷰포트에서 슬레이트 위젯을 제거하려면 기존에 추가된 위젯에 대한 각각의 레퍼런스를 GameViewportClient::RemoveViewportWidgetContent(). 에 전달하면 됩니다.

예:

GEngine->GameViewport->RemoveViewportWidgetContent(
    SNew(MyWidgetPtr.ToSharedRef())
);

추가로 GameViewportClient::RemoveAllViewportWidgets() 를 호출하면 뷰포트에서 모든 위젯을 한 번에 제거할 수 있습니다.

예:

GEngine->GameViewport->RemoveAllViewportWidgets();

GEngineGameViewportNULL 일 수 있으므로 이들이나 그 멤버에 접근하기 전 반드시 그 값을 확인해야 합니다.

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback