본문 바로가기

개발/내일배움캠프

언리얼 멀티플레이어 개발전 설정들

P2P 서버(Peer To Peer)

모든 클라이언트가 서버의 역활을 겸하는 형태.

모두가 각자에게 통신을 하는 형태로, 서버를 거치지 않기 때문에 통신이 빠르다.

다만 플레이어 수가 늘어나면 통신량이 그 수만큼 늘어나기 때문에, 소규모 게임에 적합

 

리슨서버

여러 클라이언트 중 하나가 호스트로서, 서버의 역활을 겸하는 형태.

서버를 구축하지 않아도 되기 때문에 비용이 적지만,

호스트의 상태에 따라 게임의 품질이 크게 달라지고 호스트의 권한이 큰것이 문제가 될 수 있음.

 

데디케이티드 서버(dedicated server)

오직 서버의 역활을 하는 객체가 있고, 클라이언트는 이를 통해 통신하는 형태.

모든 플레이어가 동일한 하나의 서버를 통해 통신하므로, 공평한 환경을 제공 가능하다

다만 서버의 비용이 추가되기때문에 리소스, 비용 측면에서 비용이 크다.

 

중요한 부분으로 플레이어간 통신은 하지않는다(불가능하다?)

반드시 클라이언트는 서버를 통해 통신을 함.

 

기존 스탠드얼론과 달리, 이제 서버와 클라이언트가 각각 어떤 값을 가지는지도 다르다.

 

여태 사용한 핵심 오브젝트들인 GameMode, GameState, PlayerController ,PlayerCharacter등등은 모두 서버가 가지고있고

클라이언트는 이들을 복제하여 사용한다.

이를 네트워크 복제(Replication)구조라고 하는데,

이를 시각화 한 구조는 다음과 같다.

레벨의 경우 모두가 가지고 있지만 GameMode를 제외한 모든것들은 서버에서 복제하여 클라이언트가 가지게 된다.

유일하게 Level만은 서버와 모든 클라이언트가 동일한 레벨을 가지게 되고,

게임의 로직과 규칙을 정의하는 GameMode 는 오직 서버만이 가지고 있다.

GameState는 게임의 상태(플레이 시간, 팀 점수 등)를 저장하는 곳으로 복제하여 사용하고

PlayerState는 플레이어 개인이 가지는 정보(개인 점수등)로, 모두에게 복제된다

PlayerCharacter는 실제 레벨에서 보이는 캐릭터로 복제가 되어야 한다.

PlayerController는 각 플레이어에게 자신의 컨트롤러만이 존재한다. 타인의 입력 상태를 알 필요는 없기 때문.

 

PlayerState와 PlayerCharacter에 어떤 정보를 저장할지는 데이터의 휘발성 여부와 복제 범위에 따라 결정하는것이 적절한데,

언리얼 엔진은 네트워크 최적화를 위해 캐릭터의 데이터는 Relevant범위에 따라 데이터를 전송하도록 최적화 되어있기 때문이라고 한다.

반대로 PlayerState는 항상 모든 플레이어와 공유되는 정보이기 때문에 이에 따라 저장 위치를 결정하는것이 좋다.

 

모든플레이어와 공유되어야 하며, 휘발성이 아닌 정보들이라면

개인의 K/D/A같은 점수정보나 Fps게임의 경우 Ping 수치같은게 있고

 

그에 반해 휘발성인, 필요에 따라서 알아야 하는정보로는

캐릭터의 장비나 체력값같은것이 있겟다.

캐릭터 자체가 사망시 파괴되는것도 차이라고 할 수 있겟다.

 

 

 

싱글플레이 개발시에는 어느정도 대충 넘어가도 문제가 적었지만

앞으로는 이를 명심하여 각각에 역할에 맞는 코드를 작성하여야 한다.

 

https://dev.epicgames.com/documentation/unreal-engine/networking-overview-for-unreal-engine?application_version=5.5

 

Networking Overview for Unreal Engine | Unreal Engine 5.5 Documentation | Epic Developer Community

Learn about networking in Unreal Engine including fundamental concepts and the available replication systems.

dev.epicgames.com

 

언리얼에서는 리슨 서버와 데디케이티드 서버를 자체적으로 지원하니 값을 몇가지 설정하는것으로 바로 시도해 볼 수 있다.

 

 

멀티 플레이 개발 전 언리얼 에디터에서 미리 설정 해야 할 값들

https://dev.epicgames.com/documentation/unreal-engine/play-in-editor-multiplayer-options-in-unreal-engine?lang=ko

 

Play In Editor Multiplayer Options in Unreal Engine | Unreal Engine 5.7 Documentation | Epic Developer Community

Testing gameplay with clients and servers in Unreal Engine

dev.epicgames.com

 

 

Editor Preference - Level Editor - Play - Multiplayer Options에서

Launch Seperated Server

Play Net Mode

Run Under One Process

세가지 값을 지정하도록 한다

Launch Seperated Server

서버를 따로 실행하도록 하는 옵션

 

Play Net Mode

데디케이트 서버형태의 개발을 진행할 것이니 Play As Client를 지정.

이 경우 자동으로 서버를 따로 실행하긴 하는듯.


Run Under One Process

멀티플레이어 창을 각각의 프로세스로 열것인지 결정하는 값으로.

 

true이면 하나의 프로세스라 빠른 실행과 테스트가 가능하지만 각 게임 인스턴스(각각의 클라이언트)에 각각의 환경을 만들지 않게 된다.

이는 후에 확인하려는 기능에 따라 체크를 변경해가며 사용하지만 기본적으로는 False로 사용하도록 한다.

 

 

C++ 코드 작성시 추가적인 코드 확인사항으로,

PlayerController에서 이 작업이 로컬에서 실행될 작업인지를 확인이 필요하다.

IsLocalController()라는 기본함수를 통해 체크하고

true이면 실행, false이면 Early Return하는 식으로 제어가 가능하다.