본문 바로가기
언리얼

[UE4/네트워크] 클라이언트-서버 모델 및 네트워크 개요

by 노오오오오옹 2020. 11. 25.

1. 서버

1-1. 정의

1) UE4 멀티플레이어는 클라이언트-서버 모델을 기반

2) 게임 스테이트에 대해 모든 부분을 결정하는 서버가 하나 있고, 접속된 클라이언트는 가급적 서버에 가깝게 추정한다.

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


1-2. 기본 명령어

유형 명령
리슨 서버 UE4Editor.exe ProjectName MapName?Listen -game
데디케이티드 서버 UE4Editor.exe ProjectName MapName -server -game -log
클라이언트 서버 UE4Editor.exe ProjectName ServerIP -game

데디케이티드(전용) 서버는 기본적으로 제목이 없고, -log를 붙여야 데디케이티드 서버임을 나타내는 창이 뜬다.


1-3 서버 게임플레이 흐름

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

2) 게임플레이 상태와 흐름은 일반적으로 GameMode 액터를 통해 구동된다.

3) 서버에만 이 액터의 유효 사본이 저장됩니다 (클라이언트에는 사본이 전혀 저장되지 않음).

5) 위의 상태를 클라이언트에게 알리는 용도로 GameState 액터가 있어, GameMode 액터의 중요한 상태를 반영한다.

6) 이 GameState 액터는 각 클라이언트에게 리플리 케이트 되도록 마킹되어 있다.

7)  클라이언트는 이 GameState 액터에 대한 사본을 추정 저장하며, 이 액터를 참고로 게임의 일반적인 상태를 안다.


1-4 접속 프로세스

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

2) 새 클라이언트가 처음으로 접속할 때, 몇 가지 일들이 벌어진다.

3) 먼저 클라이언트는 서버에 접속하겠다는 요청을 보냄.

4) 서버는 이 요청을 처리하고, 서버가 접속을 거부하지 않으면 적합한 진행 정보를 포함해 클라이언트에게 응답을 보냄.


1-5 접속 단계

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

2) 서버가 수락하면, 현재 맵을 전송함.

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

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

4-1) GameMode 에 접속을 거부할 수 있는 기회를 준다.

 

5) 수락되면, 서버는 AGameModeBase::Login 을 호출

5-1) 이 함수는 PlayerController 를 만든 다음, 새로 접속된 클라이언트에 리플리케이트 시킨다.

5-2) 수신되면 이 PlayerController가 클라이언트의 접속 과정에서 견본으로 사용되던 임시 PlayerController를 대체

5-3) 여기서 APlayerController::BeginPlay가 호출되는 것을 눈여겨 본다. 이 액터에서 RPC 함수를 호출하는 것은 아직 안전하지 않으며, AGameModeBase::PostLogin 호출시까지 기다려야 한다.

 

 

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

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

 

공식 문서 주소 : docs.unrealengine.com/ko/Gameplay/Networking/Server/index.html


2. 네트워크 개요

2-1. 엑터

1) 싱글 플레이어 게임에서 액터는 게임 월드를 표현하는 데 사용된다. 멀티플레이어에서도 이 부분은 다르지 않지만, 클라이언트는 각 액터를 추정해서 표현하는 반면, 서버에는 권위적인(다른 모든 것에 우선하는) 버전이 유지된다.

2) 서버가 클라이언트의 최신 상태를 유지하기 위해, 주로 사용하는 것은 액터다.

3) 서버가 특정 클라이언트를 업데이트할 때가 되면, 서버는 지난 번 업데이트 이후 변경되었다고 보는 연관 액터 전부를 수집한 다음, 해당 액터의 최신 상태를 유지하기에 충분할 만큼의 정보를 클라이언트에 전송한다.


2-2. 네트워크 모드

네트워크 모드 유형 기능 / 이상적인 사용 예시
NM_Standalone 유형은 로컬 머신에서 실행되며 원격 머신에서 클라이언트를 받지 않는 서버를 나타냅니다.

싱글 플레이어, 또는 로컬 멀티플레이 게임에 좋습니다.
NM_DedicatedServer 데디케이티드 서버, 즉 로컬 플레이어가 없어 사운드, 그래픽, 사용자 입력, 기타 플레이어 관련 기능을 제거하여 보다 효율적인 실행이 가능한 전용 서버입니다.

이 서버 유형은 신뢰 서버에서 호스팅되는 멀티플레이어 게임에 사용되며, 경쟁형 MOBA, MMO, 온라인 슈팅 게임 등 퍼포먼스가 중요해서 신뢰성있는 서버가 필요한 경우에 사용됩니다.
NM_ListenServer 리슨 서버는 로컬 플레이어가 있는 서버로, 원격 플레이어에게도 접속을 허락합니다.

이 유형의 서버는 데디케이티드 서버가 불필요한 경쟁 또는 협력 게임에 좋으며, 사용자는 써드 파티 서버 없이 자신의 게임을 구성하여 플레이할 수 있습니다.

이 네트워크 모드 유형은 호스트에 네트워크 지연시간이 없어 호스트 플레이어에게 약간 유리할 수 있으며, 호스트는 경고 없이 게임을 중단시킬 수 있습니다.
NM_Client
서버가 아닌 유일한 모드입니다.

이 모드의 로컬 머신은 데디케이티드 또는 리슨 서버로 접속되는 클라이언트이므로, 서버측 로직은 실행되지 않습니다.

댓글