전용 서버 구성하기

프로젝트를 위한 전용 서버를 구성하고 패키징하는 방법을 알아봅니다.

언리얼 엔진(UE) 에서 사용되는 서버-클라이언트(server-client) 모델은 네트워크 멀티플레이어 게임을 게임의 호스트 역할을 하는 서버 하나와 클라이언트 로서 그 게임에 참여하는 플레이어들로 나타냅니다. 실제 게임 스테이트는 서버가 관리하며, 각 플레이어는 자율 프록시(Autonomous Proxy) 를 통해 원격으로 자신의 폰을 컨트롤합니다. 그러면 서버가 변경 사항을 연결된 클라이언트로 리플리케이트 하여 모든 플레이어가 서버에서 게임이 플레이되는 것과 아주 유사한 경험을 하게 됩니다.

리슨 서버(listen server) 가 자신의 머신에서 게임을 호스팅하는 플레이어를 나타낸다면, 전용 서버(dedicated server) 는 헤드리스로 실행되는 서버입니다. 헤드리스 서버는 비주얼을 렌더링하지 않으므로 로컬로 플레이하는 사람이 없습니다. 그래서 전용 서버는 게임플레이 로직과 클라이언트로부터 수신되는 정보의 관리에 주력하여 리소스 대부분을 게임 호스팅에 활용할 수 있습니다. 또한 멀티플레이어 게임에 참여하는 모든 플레이어 간에 균일한 플레이 공간을 제공합니다. 리슨 서버는 캐주얼 멀티플레이어 및 협동 플레이에 적합하고, 전용 서버는 대규모 또는 경쟁 게임에 이상적입니다.

이 하우투 가이드에서는 멀티플레이어 게임을 위한 전용 서버를 구성하고 패키징하는 방법을 알아봅니다.

1. 필수 구성

이 하우투 가이드의 단계를 따르려면 프로젝트가 다음 요건을 충족해야 합니다.

  • 언리얼 엔진의 소스 빌드를 사용해야 합니다. 에픽게임즈 Github에서 다운로드할 수 있습니다.

    • 프로젝트에서 에픽게임즈 런처로 받은 바이너리 빌드를 사용하는 경우, Github 소스 빌드로 마이그레이션해야 합니다.

  • 서버-클라이언트 멀티플레이어 게임플레이를 지원하는 C++ 프로젝트가 있어야 합니다.

    • 블루프린트 프로젝트를 사용한다면, 먼저 C++ 프로젝트로 변환한 뒤 진행해야 합니다.

이 예시에서는 삼인칭 템플릿(third-person template) 으로 만든 새 프로젝트를 사용합니다.

멀티플레이어 프로젝트를 처음부터 제작하려면, 삼인칭 템플릿에 기본적인 멀티플레이어 메커니즘을 추가하는 네트워크 멀티플레이어 퀵스타트 가이드를 참고하세요.

2. 서버 빌드 타깃 구성

전용 서버는 프로젝트마다 분리된 빌드 타깃(build target) 입니다. 전용 서버를 하나 생성하면 베이스 게임과 다른 실행 파일을 하나 생성합니다. "TestProjectGame.exe"가 아닌 "TestProjectServer.exe"가 생성되며, 이 실행 파일을 실행하면 컴퓨터에서 전용 서버가 시작됩니다. 이 섹션에서는 프로젝트에 서버 빌드 타깃을 추가하고 컴파일하는 단계를 살펴봅니다.

  1. 프로젝트의 C++ 솔루션을 엽니다. 프로젝트 폴더에 있을 것입니다. 여기서는 MyProject.sln 입니다.

    ProjectSolutionInFolder.png

    C++ 솔루션이 없는 경우 .uproject 파일을 우클릭하고 Generate Visual Studio Project Files 를 선택하여 생성할 수 있습니다.

  2. 솔루션 탐색기(Solution Explorer) 에서 Source 폴더를 펼치고 [프로젝트 이름].Target.cs 파일을 찾습니다. 이 파일이 프로젝트의 디폴트 빌드 타깃입니다. 언리얼 에디터가 이 프로젝트를 위해 빌드하는 방법을 설정하는 [프로젝트 이름]Editor.Target.cs 파일도 있습니다. 동일한 디렉터리에서 서버 빌드 타깃을 생성하겠습니다.

    TestProjectTarget.png

  3. Windows 탐색기 에서 Source 폴더를 엽니다. [프로젝트 이름].Target.cs 의 사본을 생성하고 [프로젝트 이름]Server.Target.cs 로 이름을 변경합니다. 여기서는 결과 파일을 TestProjectServer.Target.cs 로 명명했습니다.

    ServerTargetInFolder.png

  4. Visual Studio로 돌아간 다음 *Server.Target.cs 를 탐색기 창에서 솔루션 탐색기(Solution Explorer) 의 Source 폴더로 드래그합니다.

    TestProjectServerTarget.png

  5. [프로젝트 이름]Server.Target.cs 파일을 열고 내용을 다음 타깃 파일 인스트럭션으로 대체합니다.

    // Copyright Epic Games, Inc. All Rights Reserved.
    
    using UnrealBuildTool;
    using System.Collections.Generic;
    
    public class TestProjectServerTarget : TargetRules //이 행은 프로젝트 이름에 맞게 변경합니다.
    {
        public TestProjectServerTarget(TargetInfo Target) : base(Target) //이 행은 프로젝트 이름에 맞게 변경합니다.
        {
            Type = TargetType.Server;
            DefaultBuildSettings = BuildSettingsVersion.V2;
            ExtraModuleNames.Add("TestProject"); //이 행은 프로젝트 이름에 맞게 변경합니다.
        }
    }

    TestProject 인스턴스는 모두 프로젝트 이름으로 대체해야 합니다.

  6. 베이스 디렉터리에서 프로젝트의 .uproject 파일을 찾은 다음 우클릭 하고 Generate Visual Studio Project Files 를 선택합니다. 그러면 게임의 Visual Studio 솔루션이 다시 생성되고, *Server.Target.cs file 파일을 발견할 것입니다.

  7. Development Editor 빌드 환경설정을 선택합니다.

  8. 툴바에서 빌드(Build) > 솔루션 빌드(Solution Build) 를 클릭하여 솔루션을 빌드 합니다. 이 작업은 솔루션 탐색기 창의 컨텍스트 메뉴를 통해서도 할 수 있습니다.

  9. Development Server 빌드 환경설정을 선택하고 솔루션을 다시 빌드 합니다.

  10. 프로젝트의 Binaries/Win64 폴더를 찾습니다. 이 폴더 안에 [프로젝트 이름]Server.exe 를 비롯한 서버 파일이 있을 것입니다.

    DedicatedServerExecutables.png

    전용 서버를 디플로이할 때 이 실행 파일을 사용합니다.

3. 엔트리 및 디폴트 맵 구성

전용 서버를 테스트하려면 서버가 플레이 가능한 맵을 실행하고 사용자가 서버에 연결할 수 있도록 프로젝트의 디폴트 맵을 구성해야 합니다. 다양한 방법이 있지만, 가장 빠르고 직접적인 방법은 사용자가 애플리케이션을 시작할 때 사용자의 엔트리 맵에 대해 직접 연결 플로를 빌드하는 것입니다.

  1. 언리얼 에디터 에서 프로젝트를 엽니다. 콘텐츠 브라우저(Content Browser) 에서 모든 레벨(Level) 파일을 콘텐츠(Content)/Maps 폴더로 이동합니다. ThirdPersonCPP 의 Maps 폴더를 베이스 콘텐츠(Content) 폴더로 이동하면 됩니다.

    MoveMapFiles.png

  2. [프로젝트 이름]Entry 라는 이름의 새 레벨을 생성합니다. [프로젝트 이름]은 프로젝트 이름으로 대체하세요. 이 예시에서는 TestProjectEntry 입니다. 기본(Blank) 맵을 시작 템플릿으로 사용하여 만들어도 됩니다.

    EntryMap.png

  3. 엔트리(Entry) 맵을 열고 레벨 블루프린트(Level Blueprint) 스크립트를 엽니다. BeginPlay 노드에서 Open Level 노드를 추가하고 값을 127.0.0.1 로 합니다. 이 값은 로컬 IP 주소입니다. 게임에 여러분의 컴퓨터에 있는 서버로 연결하도록 지시하는 것입니다. 이 값을 유효한 IP 주소로 바꾸면 해당 주소에 있는 서버로 연결합니다.

    일반적으로 엔트리 맵에는 메인 메뉴 UI를 구성합니다. 이 예시에서 엔트리 레벨은 전용 서버로 빠르게 연결할 수 있도록 사용자 자신의 로컬 IP로 연결됩니다. UI가 있는 완전 피처 엔트리 맵의 예시는 라이라 샘플 게임을 참고하세요.

  4. ThirdPersonExampleMap 을 열고 레벨에 사전 배치되어 있는 ThirdPersonCharacter 를 삭제합니다. 그 대신 레벨에 PlayerStarts 를 두 개 배치합니다. 이렇게 하면 플레이어가 연결될 때 일관된 시작 경험을 하게 됩니다.

  5. 프로젝트 세팅을 열고 프로젝트 > 맵 & 모드로 이동한 다음 디폴트 맵을 펼칩니다. 다음과 같이 변경합니다.

    파라미터 이름

    에디터 스타트업 맵(Editor Startup Map)

    [프로젝트 이름]Entry

    게임 디폴트 맵(Game Default Map)

    [프로젝트 이름]Entry

    트랜지션 맵(Transition Map)

    없음

    서버 디폴트 맵(Server Default Map)

    ThirdPersonExampleMap

    이렇게 하면 서버가 곧장 ThirdPersonExampleMap으로 열리며, 사용자는 Entry 맵을 열고 서버에 연결합니다.

4. 프로젝트 패키징

  1. 파일(File) > 프로젝트 패키지(Package Project) > 패키징 세팅(Packaging Settings) 을 클릭하여 패키징 세팅을 엽니다.

  2. 패키징(Packaging) 섹션 하단의 화살표가 있는 직사각형 버튼을 클릭하여 고급(Advanced) 세팅을 표시합니다.

  3. 패키지 된 빌드에 포함시킬 맵 목록(List of Maps to Include in a Packaged Build)Entry 맵과 ThirdPersonExampleMap 을 추가합니다.

  4. 파일(File) > 프로젝트 패키지(Package Project) > Windows (64-bit) 를 클릭한 다음 프로젝트를 패키징할 디렉터리를 선택합니다. 여기서는 TestProject/Packaged 를 출력 폴더로 사용합니다.

  5. 파일(File) > 프로젝트 패키지(Package Project) > 빌드 타깃(Build Target) 을 클릭합니다. 일반 빌드 타깃과 함께 [프로젝트 이름]Server 가 보일 것입니다. 이 옵션을 선택합니다.

  6. 프로젝트를 다시 패키징하고 이전과 동일한 출력 폴더를 선택합니다. 이제 WindowsServer 폴더가 WindowsNoEditor 와 함께 있을 것입니다.

5. 전용 서버 실행 및 테스트

이제 전용 서버를 테스트할 시간입니다.

  1. 이전 섹션에서 생성한 WindowsServer 폴더를 열고 [프로젝트 이름]Server.exe 를 찾습니다. 여기서는 TestProjectServer.exe 입니다.

  2. Server.exe 의 바로가기를 생성하고 이름을 편집하여 끝에 ' - ThirdPersonExampleMap' 을 추가합니다. 여기서는 TestProjextServer.exe - ThirdPersonExampleMap 으로 이름을 변경했습니다.

  3. 서버 바로가기우클릭 하여 프로퍼티(properties) 를 엽니다. 타깃(Target) 필드 끝에 '-log' 를 추가하고 적용(Apply) 을 누릅니다.

    ShortcutProperties.png

    이렇게 하면 전용 서버를 실행할 때 명령 프롬프트에 로그가 표시됩니다. 이전 섹션의 구성에 따라 서버는 이미 ThirdPersonExampleMap으로 열릴 것이므로 바로가기에 맵 파라미터를 추가할 필요는 없습니다.

  4. 바로가기더블클릭 하여 전용 서버를 실행합니다. 명령 프롬프트 창이 열리면서 출력 로그를 표시합니다. 서버가 성공적으로 실행되면 하단에서 레벨을 여는 데 몇 초가 걸렸는지 볼 수 있습니다.

    DedicatedServerCommandPrompt.png

  5. WindowsNoEditor 폴더로 가서 TestProject.exe 를 더블클릭합니다. 게임이 새 창으로 열리며 ThirdPersonExampleMap이 바로 나타나는 것처럼 보일 것입니다.

  6. Alt+Tab 을 사용하여 게임 창을 떠난 다음 TestProject.exe 를 실행하여 두 번째 게임 인스턴스를 실행합니다. 성공하면 실행한 창에서 플레이어가 보일 것입니다. 서버 로그를 확인하여 두 플레이어가 서버에 연결된 것을 확인할 수도 있습니다.

DedicatedServerRunning.png

이상으로 모든 과정이 완료되었습니다. 프로젝트를 위한 전용 서버를 성공적으로 빌드, 패키징, 테스트했습니다.

직접 해 보기

이 예시에서는 로컬 머신에서 서버를 빌드, 패키징, 테스트하는 방법의 기초를 알아보았습니다. 다음 단계는 잘 작동하는 프론트엔드를 제공하고, 게임플레이를 확장하고, 플레이어가 인터넷으로 전용 서버에 연결할 방법을 제공하는 것입니다.

작동하는 프론트엔드의 예시는 라이라 샘플 게임을 참고하세요.

게임플레이를 확장하기 시작하려면 네트워크 멀티플레이어 퀵스타트 가이드를 참고하세요.

네트워크를 통해 서버에 연결하려는 경우 127.0.0.1 자리에 서버의 IP 주소를 입력하면 됩니다. Entry 맵에서 BeginPlay를 실행하는 대신 간단한 UMG UI를 통합할 수도 있습니다. 또한 콘솔에서 'open' 명령을 사용하여 레벨 이름 자리에 IP 주소를 제공할 수도 있습니다.

언리얼 엔진의 이전 버전을 위해 작성된 페이지입니다. 현재 언리얼 엔진 5 버전을 위해 업데이트되지 않았습니다.