클라이언트-서버 모델

멀티플레이어에서 서버의 역할에 대한 개요입니다.

Choose your operating system:

Windows

macOS

Linux

UE4 멀티플레이어는 클라이언트-서버 모델을 기반으로 합니다. 즉 게임 스테이트에 대해 권위적인(모든 부분을 결정하는) 서버가 하나 있고, 거기에 접속된 클라이언트는 가급적 서버에 가깝게 추정해 냅니다.

서버는 UE4 멀티플레이어의 중요한 부분입니다. 중요한 의사결정을 전부 내리고, 모든 권위적 상태가 저장되고, 클라이언트 접속을 처리하고, 새로운 맵으로 이동하며, 경기 시작이나 종료와 같은 전반적인 게임플레이 흐름을 담당합니다.

서버 시작하기

기본 명령입니다 (이 명령은 에디터를 사용하므로 쿠킹된 데이터가 필요치 않습니다):

유형

명령

리슨 서버

UE4Editor.exe ProjectName MapName?Listen -game

데디케이티드 서버

UE4Editor.exe ProjectName MapName -server -game -log

클라이언트

UE4Editor.exe ProjectName ServerIP -game

데디케이티드(전용) 서버는 기본적으로 제목이 없습니다. -log 를 붙이지 않으면, 데디케이티드 서버임을 나타내는 창이 보이지 않습니다.

서버 게임플레이 흐름

게임플레이 흐름의 구동을 담당하는 것은 서버입니다. 새 맵으로 이동할 때가 되었음을, 게임플레이가 시작 및 종료되었음을, 액터 리플리케이션 업데이트 등과 함께 클라이언트에 알리는 것은 서버의 역할입니다.

프레임워크 주요 부분 은 거의 이 문서의 범위를 벗어나는 것이지만, 특정 클래스 작업시 소개되는 부가적인 멀티플레이어 관련 뉘앙스에 대해서는 조금 이야기해 볼 수 있습니다.

게임플레이 상태와 흐름은 일반적으로 GameMode 액터를 통해 구동됩니다. 서버에만 이 액터의 유효 사본이 저장됩니다 (클라이언트에는 사본이 전혀 저장되지 않습니다). 이러한 상태를 클라이언트에게 통신하기 위한 용도로 GameState 액터가 있어, GameMode 액터의 중요한 상태를 반영합니다. 이 GameState 액터는 각 클라이언트에게 리플리케이트 되도록 마킹되어 있습니다. 클라이언트는 이 GameState 액터에 대한 사본을 추정 저장하며, 이 액터를 참고로 하여 게임의 일반적인 상태를 알 수 있습니다.

GameMode 에 대한 상세 설명은, 게임 모드와 게임 스테이트 문서를 참고하세요.

접속 프로세스

서버가 네트워킹 관점에서 무언가 흥미로운 작업을 하기 위해서는, 클라이언트 접속이 필요합니다!

새 클라이언트가 처음으로 접속할 때, 몇 가지 일들이 벌어집니다. 먼저 클라이언트는 서버에 접속하겠다는 요청을 보냅니다. 서버는 이 요청을 처리한 다음, 서버가 접속을 거부하지 않으면 적합한 진행 정보를 포함해서 클라이언트에게 응답을 보냅니다.

주요 단계는 이렇습니다:

  1. 클라이언트가 접속 요청을 보냅니다.

  2. 서버가 수락하면, 현재 맵을 전송합니다.

  3. 서버는 클라이언트가 이 맵을 로드할 때까지 기다립니다.

  4. 로드가 되면, 서버 로컬에서 AGameModeBase::PreLogin 를 호출합니다.

    • GameMode 에 접속을 거부할 수 있는 기회를 줍니다.

  5. 수락되면, 서버는 AGameModeBase::Login 을 호출합니다.

    • 이 함수의 역할은 PlayerController 를 만든 다음 새로 접속된 클라이언트에 리플리케이트 시킵니다. 수신되면 이 PlayerController 가 클라이언트의 접속 과정에서 견본으로 사용되던 임시 PlayerController 를 대체합니다.

    • 여기서 APlayerController::BeginPlay 가 호출되는 것을 눈여겨 봅시다. 이 액터에서 RPC 함수를 호출하는 것은 아직 안전하지 않다는 점 참고하시구요. AGameModeBase::PostLogin 호출시까지 기다려야 합니다.

  6. 모든 것이 잘 돌아갔다는 가정하에 AGameModeBase::PostLogin 이 호출됩니다.

    • 이제 서버가 이 PlayerController 에서 RPC 함수 호출을 시작해도 안전합니다.

언리얼 엔진 문서의 미래를 함께 만들어주세요! 더 나은 서비스를 제공할 수 있도록 문서 사용에 대한 피드백을 주세요.
설문조사에 참여해 주세요
건너뛰기