개요
언리얼 엔진(Unreal Engine, UE) 은 네트워크 멀티플레이어 게임에 클라이언트-서버(client-server) 모델을 사용합니다. 한 서버가 게임의 호스트 역할을 하며 호스트에 연결된 플레이어는 클라이언트 역할을 합니다. 실제 게임 스테이트는 서버에서 조정하며, 이때 서버를 권한 있는 호스트(authoritative host) 라고 합니다. 플레이어는 자율 프록시(autonomous proxy) 로 폰을 제어합니다. 서버는 연결된 각 클라이언트의 변경사항을 리플리케이트(replicate) 하여 연결된 각 클라이언트의 실제 게임 스테이트를 시뮬레이션합니다. 클라이언트는 서버에서 실제로 플레이되고 있는 게임에 아주 가까운 근사값을 봅니다.
데디케이티드 서버
리슨 서버(listen server) 는 자신의 머신에서 게임을 호스팅하면서 서버 역할을 하는 클라이언트로 구성됩니다. 다른 클라이언트는 호스팅하는 클라이언트에 연결하여 호스팅하는 클라이언트의 인스턴스에서 게임을 플레이합니다. 이 모델에서는 호스팅하는 클라이언트가 권한 있는 호스트 입니다. 이 경우 호스팅하는 클라이언트는 실제 게임 스테이트를 플레이하고 있으므로 연결된 클라이언트보다 이점을 갖습니다.
데디케이티드 서버(dedicated server) 는 헤드리스로 실행되는 서버로 구성됩니다. 즉 데디케이티드 서버 게임 인스턴스에서 직접 플레이하는 클라이언트가 없습니다. 각 플레이어는 연결된 원격 클라이언트로 참여합니다. 헤드리스 서버는 비주얼을 렌더링하지 않으며 로컬로 플레이하는 사람이 없습니다.
이는 리슨 서버에 비해 여러 장점을 갖습니다.
- 더 작은 규모
- 호스트 클라이언트에 불공정한 이점이 없음
- 게임플레이 로직에 초점을 맞추고 클라이언트로부터 받는 정보 조정
리슨 서버는 캐주얼 멀티플레이어 및 협동 게임에 적합하고, 데디케이티드 서버는 대규모 또는 경쟁 게임에 이상적입니다.
이 튜토리얼에서는 데디케이티드 서버를 빌드, 쿠킹, 테스트하는 방법을 알아봅니다.
튜토리얼
이 튜토리얼에서는 라이라 스타터 게임 을 기반으로 데디케이티드 서버 및 클라이언트를 구성합니다. 라이라는 즉시 사용 가능한 멀티플레이어 기능을 제공하므로 이 튜토리얼의 샘플 게임으로 이상적입니다.
이 튜토리얼의 단계를 따르려면 프로젝트가 다음 요건을 충족해야 합니다.
- 언리얼 엔진 소스 빌드를 사용해야 합니다. 자세한 정보는 언리얼 엔진 소스 코드 내려받기 페이지를 참고하세요.
- 클라이언트-서버 멀티플레이어 게임플레이를 지원하는 C++ 프로젝트를 사용해야 합니다.
라이라 환경설정
라이라를 위한 Visual Studio 프로젝트 파일을 생성했는지 확인합니다. 또한 언리얼 엔진 버전을 소스 빌드로 전환했는지 확인합니다. 이렇게 하는 방법은 엔진 소스 빌드용 라이라 다운로드하기 문서 페이지에서 볼 수 있습니다. 이렇게 한 다음 프로젝트 소스 디렉터리로 이동하고 LyraStarterGame.uproject 를 열어서 언리얼 에디터 에서 라이라를 엽니다.
라이라 샘플에서 데디케이티드 서버 및 클라이언트 빌드를 빌드하기에 앞서 몇 가지 변경해야 할 것이 있습니다.
- 서버 디폴트 맵(Server Default Map) 을 L_Expanse 로 변경하여 클라이언트가 라이라 메인 메뉴 대신 맵으로 곧장 이동하게 합니다.
- 스폰되는 봇의 수를 0으로 변경하여 클라이언트가 서버에 연결되자마자 봇에게 공격받지 않게 합니다.
서버 디폴트 맵 설정
- 메뉴 바에서 편집(Edit) > 프로젝트 세팅(Project Settings) 으로 이동합니다. 그러면 새 프로젝트 세팅(Project Settings) 창이 열립니다.
- 왼쪽 메뉴에서 프로젝트(Project) > 맵 & 모드(Maps & Modes) 를 찾습니다.
- 디폴트 맵(Default Maps) > 고급(Advanced) > 서버 디폴트 맵(Server Default Map) 을 L_Expanse 로 변경합니다.
- 프로젝트 세팅(Project Settings) 창을 닫습니다.
라이라로 사용 가능한 맵에 대한 자세한 내용은 라이라 샘플 게임 문서를 참조하세요.
봇 수 변경
- 봇의 수를 변경하려면 라이라 에셋 중 하나를 편집해야 합니다. 에셋을 편집하려면 콘텐츠 드로어(Content Drawer) 를 엽니다.
- 디렉터리를 Plugins 로 변경합니다.
B_ShooterBotSpawner블루프린트를 찾습니다. 스폰되는 봇의 수를 변경하려면 이 블루프린트를 편집해야 합니다.B_ShooterBotSpawner블루프린트를 엽니다. 이 블루프린트 세팅이 새 창으로 열립니다.- 팀(Teams) 섹션에서 생성할 봇 수(Num Bots to Create) 필드를 찾습니다.
- 기본적으로 이 수는 3으로 설정되어 있어서 언리얼 에디터 에서 게임을 시작하면 2대2 섬멸전 스타일 게임이 시작됩니다. 생성할 봇 수(Num Bots to Create) 를 0으로 설정합니다. 이렇게 하면 동일한 데디케이티드 서버에 연결된 클라이언트를 봇의 방해 없이 볼 수 있습니다.
- 창 좌측 상단에 컴파일(Compile) 버튼이 있습니다. 블루프린트 변경사항이 적용되도록 컴파일 을 클릭합니다.
- 블루프린트 창을 닫습니다.
이제 초기 프로젝트 세팅이 구성됐습니다. 언리얼 에디터 를 닫습니다.
라이라를 사용하여 이 가이드를 따라 하고 있다면, 파일 경로에 있는 라이라 샘플의 PROJECT_NAME 변수는 LyraStarterGame 입니다.
빌드
서버
이제 라이라 스타터 게임(Lyra Starter Game) 프로젝트의 개발 서버(Development Server) 환경설정을 빌드할 준비가 됐습니다.
- 파일 탐색기(File Explorer) 에서 프로젝트의 루트 디렉터리로 이동합니다.
- 프로젝트의
*.uproject파일을 우클릭하고 Visual Studio 프로젝트 파일 생성(Generate Visual Studio project files) 을 선택합니다. - 생성된
*.slnVisual Studio 솔루션 파일을 Visual Studio (VS) 에서 엽니다. <PROJECT_NAME>Server.Target.cs파일이<PROJECT_DIRECTORY>/Source디렉터리에 없는 경우 이 파일을 생성합니다.- 예시는
LyraServer.Target.cs를 참조하세요.
- 예시는
- 솔루션 구성(Solution Configuration) 을 Development Server 로 변경합니다.
- 메뉴 바에서 빌드(Build) > 솔루션 빌드(Build Solution) 를 선택합니다. 이렇게 하면 프로젝트의 데디케이티드 서버가 빌드됩니다.
- 빌드 프로세스가 성공적으로 완료되면 새로 생성된 파일, 특히
<PROJECT_NAME>Server.exe실행 파일을<PROJECT_DIRECTORY>/Binaries/Win64디렉터리에서 찾을 수 있습니다.- Lyra의 경우 이 파일은
LyraStarterGame/Binaries/Win64에 있으며 실행 파일은LyraServer.exe입니다.
- Lyra의 경우 이 파일은
클라이언트
서버를 빌드했으니 이제 라이라 스타터 게임 의 개발 클라이언트(Development Client) 구성을 빌드할 수 있습니다.
- 서버 빌드 단계의 Visual Studio를 열어 둔 상태로 솔루션 구성(Solution Configuration) 을 Development Client 로 변경합니다.
<PROJECT_NAME>Client.Target.cs파일이<PROJECT_DIRECTORY>/Source디렉터리에 없는 경우 이 파일을 생성합니다.- 예시는
LyraClient.Target.cs를 참조하세요.
- 예시는
- 메뉴 바에서 빌드(Build) > 솔루션 빌드(Build Solution) 를 선택합니다. 이렇게 하면 프로젝트의 클라이언트 게임이 빌드됩니다.
- 빌드 프로세스가 성공적으로 완료되면 새로 생성된 파일, 특히
<PROJECT_NAME>Client.exe실행 파일을<PROJECT_DIRECTORY>/Binaries/Win64디렉터리에서 찾을 수 있습니다.- Lyra의 경우 이 파일은
LyraStarterGame/Binaries/Win64에 있으며 실행 파일은LyraClient.exe입니다.
- Lyra의 경우 이 파일은
쿠킹
서버 콘텐츠
이제 데디케이티드 서버와 서버에 연결할 클라이언트를 모두 빌드했습니다. Visual Studio에서 서버를 실행하려고 하면 셰이더가 없다는 오류 메시지가 표시됩니다. 콘텐츠를 쿠킹하지 않았기 때문입니다. 서버 콘텐츠를 쿠킹하려면 다음 단계를 따릅니다.
- 개발 에디터(Development Editor) 를 Visual Studio에서 시작하거나 프로젝트 디렉터리의
UnrealEditor.exe로 이동하여 시작합니다. - 메인 툴바 에서 플랫폼(Platforms) > 창(Windows) > 빌드 타깃(Build Target) 을
Server 로 설정하고 플랫폼 > 창 > 바이너리 환경설정(Binary Configuration) 을 개발(Development) 로 설정합니다. - 플랫폼 > 창 > 콘텐츠 관리(Content Management) 에서 쿠킹(Cook) 을 실행합니다.
- 우측 하단에 콘텐츠가 쿠킹되고 있음을 나타내는 대화 상자가 표시됩니다. 쿠킹 진행률을 모니터링하려면 이 대화 상자에서 출력 로그 표시(Show Output Log) 를 클릭합니다.
- 프로세스가 성공적으로 종료되면 출력 로그에 빌드 성공(BUILD SUCCESSFUL) 이 표시됩니다.
- 쿠킹 프로세스에서 생성된 파일을 보려면
<PROJECT_DIRECTORY>/Saved/Cooked/WindowsServer로 이동합니다. - 명령줄에서 프로젝트 디렉터리로 이동하고
./Binaries/Win64/<PROJECT_NAME>Server.exe -log를 실행하여 서버가 잘 실행되는지 테스트합니다. - 로깅(Logging) 창을 닫아서 데디케이티드 서버를 종료합니다.
클라이언트 콘텐츠
클라이언트 콘텐츠를 쿠킹하려면 다음 단계를 따릅니다.
- 언리얼 에디터 가 실행 중이 아닌 경우 개발 에디터(Development Editor) 를 Visual Studio에서 시작하거나 프로젝트 디렉터리의
UnrealEditor.exe로 이동하여 시작합니다. - 메인 툴바(Main Toolbar) 에서 플랫폼(Platforms) > 창(Windows) > 빌드 타깃(Build Target) 을
Client 로 설정하고 플랫폼 > 창 > 바이너리 환경설정(Binary Configuration) 을 개발(Development) 로 설정합니다. - 플랫폼 > 창 > 콘텐츠 관리(Content Management) 에서 쿠킹(Cook) 을 실행합니다.
- 우측 하단에 콘텐츠가 쿠킹되고 있음을 나타내는 대화 상자가 표시됩니다. 쿠킹 진행률을 모니터링하려면 이 대화 상자에서 출력 로그 표시(Show Output Log) 를 클릭합니다.
- 프로세스가 성공적으로 종료되면 출력 로그에 빌드 성공(BUILD SUCCESSFUL) 이 표시됩니다.
- 쿠킹 프로세스에서 생성된 파일을 보려면
<PROJECT_DIRECTORY>/Saved/Cooked/WindowsClient로 이동합니다. - Visual Studio로 이동하고 솔루션 구성(Solution Configuration) 을 Development Client 로 변경한 다음 디버그하지 않고 시작(Run without Debugging) 을 선택하여 클라이언트를 실행합니다.
- 경험을 아직 로딩 중입니다(Experience Still Loading) 라는 스플래시 화면이 표시됩니다. 클라이언트가 성공적으로 실행되지만 현재 실행 중이 아닌 데디케이티드 서버에 연결되기를 기다리는 것입니다. 라이라 클라이언트 창을 닫습니다.
테스트
데디케이티드 서버 시작
터미널 창에서 프로젝트 루트 디렉터리로부터 다음 명령을 실행합니다.
./Binaries/Win64/<PROJECT_NAME>Server.exe -log
그러면 데디케이티드 서버가 시작되며 로깅 창이 표시됩니다.
기본적으로 데디케이티드 서버는 로컬 호스트 IP 주소 (127.0.0.1 )를 포트 7777 에서 리슨합니다. 명령줄 실행인자 -port=<PORT_NUMBER> 를 추가하여 데디케이티드 서버의 포트를 변경할 수 있습니다. 서버가 사용 중인 포트를 변경하려면 클라이언트를 서버로 연결할 때도 포트를 변경해야 합니다.
클라이언트를 데디케이티드 서버에 연결
터미널 창에서 프로젝트 루트 디렉터리로부터 다음 명령을 실행합니다.
./Binaries/Win64/<PROJECT_NAME>Client.exe 127.0.0.1:7777 -WINDOWED -ResX=800 -ResY=450
그러면 클라이언트 게임 인스턴스가 시작됩니다. 두 클라이언트가 동일한 데디케이티드 서버에 연결되는 것을 재현하기 위해 같은 명령을 반복하여 다른 클라이언트 인스턴스를 시작합니다.
./Binaries/Win64/<PROJECT_NAME>Client.exe 127.0.0.1:7777 -WINDOWED -ResX=800 -ResY=450
이제 게임에 두 명의 플레이어가 보일 것입니다. 서버 로그를 확인하여 두 플레이어가 서버에 연결된 것을 확인할 수도 있습니다.
여기서 설정한 -WINDOWED, -ResX=<HORIZONTAL_RESOLUTION> 및 -ResY=<VERTICAL_RESOLUTION> 명령줄 실행인자는 편의를 위한 것입니다. 이렇게 하면 테스트 목적으로 같은 화면에서 두 클라이언트 창을 쉽게 볼 수 있습니다. 여기서 사용된 명령줄 실행인자에 대한 추가 정보는 명령줄 실행인자 페이지를 참조하세요.
멀티플레이어 경험 확장
이 튜토리얼에서는 로컬 머신에서 데디케이티드 서버를 빌드, 쿠킹, 테스트하는 방법을 알아봅니다. 다음 단계는 잘 작동하는 프론트엔드를 제공하고, 게임플레이를 확장하고, 플레이어가 인터넷으로 데디케이티드 서버에 연결할 방법을 제공하는 것입니다.
라이라 샘플
언리얼 엔진에서 작동하는 게임 샘플의 예시는 라이라 샘플을 참고하세요.
%samples-and-tutorials/sample-games/lyra-game-sample:topic%
게임플레이 확장
게임의 멀티플레이어 게임플레이 확장을 위한 자세한 내용은 네트워크 멀티플레이어 퀵스타트 가이드를 참조하세요.