언어:
페이지 정보
엔진 버전:
언리얼 엔진

게임내 슬레이트 사용하기

언리얼 엔진

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 일 수 있으므로 이들이나 그 멤버에 접근하기 전 반드시 그 값을 확인해야 합니다.