unreal 5기

251118 언리얼엔진 본캠프 69일차 NetMode

parkjinnam 2025. 11. 18. 21:34

언리얼에서의 멀티플레이

본격적으로 언리얼엔진의 멀티플레이에 대해서 배우기 시작했다. 코드만 잘 작성해서 구조만 잘 만져주면 알아서 잘 돌아가던 싱글게임(스탠드얼론)과는 다르게 멀티플레이에서는 서버와 클라이언트에서 다루는 클래스가 다르기에 여러 모로 복잡하고 내용이 어렵다. 그중에서 오늘은 NetMode에 대해서 공부해 보았다.

 

NetMode는 해당 게임 프로세스가 네트워크 상에서 어떤 역할을 하고 있는지를 의미하며 싱글(NM_StandAlone), 서버(NM_Listen, NM_DedicatedServer), 클라이언트(NM_Client)로 나뉘게 된다.

 

1. NM_StandAlone

싱글 플레이어 게임으로서 서버와 클라이언트의 구분이 없고 네트워크 기능이 작동하지 않거나 무시된다. 인터넷 연결이 없어도 돌아가는 로컬 게임이다.

 

2. NM_Client

서버에 접속해 있는 플레이어를 의미한다. 서버로부터 게임 상태를 전송받아 화면에 그려준다. 앞서 말했듯 게임에 권한이 없어서 중요한 로직은 직접 처리할 수 없으며 서버에서 처리해달라 요청해야 한다.

 

3. NM_DedicatedServer(데디케이티드 서버)

플레이어가 없는 순수 서버를 의미한다. Headless라는 특징을 갖고 있는데 이는 그래픽, 사운드, UI처리를 전혀 하지 않고 오직 게임 로직과 데이터 동기화만 담당하는 것을 의미한다. 플레이어가 직접 조종하는 로컬 유저가 없으며 모든 클라이언트가 공평한 핑 환경을 갖게 된다. 주로 대규모 MMO 환경에서 사용된다.

 

4. NM_ListenServer(리슨서버)

플레이어이면서 동시에 서버 역할을 하는 호스트를 의미한다. 한 명의 플레이어가 호스트가 되어 자신의 컴퓨터를 서버로 사용하게 된다. 이 사람은 그래픽의 렌더링과 다른 클라이언트의 접속도 처리하며 이러한 특성 때문에 별도의 서버 비용이 들지 않는다는 장점이 있다. 다만 앞서 보았던 데디케이티드 서버와 다르게 방장은 핑이 0인 반면 다른 클라이언트의 핑은 그렇지 않아 공평하지 않은 환경이 나올 수 있다. 또한 호스트의 컴퓨터가 꺼지면 게임이 터지게 된다.

 

언리얼에서의 멀티구현은 기본적으로 서버와 클라이언트로 나뉘어서 서버에서 모든 결정을 하고 그 결과를 클라이언트가 수신해서 플레이어의 화면에 띄우는 방식으로 진행된다. 만약 대미지를 입어서 HP가 줄어드는 로직을 작성한다고 생각해 보자. 이를 각각의 클라이언트에서 처리한다면 해커는 그저 서버와 클라이언트 간에 통신을 가로채 수정한 값을 서버로 보내면 쉽게 핵을 만들 수 있을 것이다. 그렇기에 중요한 내용은 서버에서 처리해줘야 하고 그 값을 클라이언트가 받게끔 설계해야 한다.

 

그렇기에 필요한 NetMode

NetMode는 우리가 작성하고 있는 로직이 서버에서 돌고 있는지 클라이언트에서 돌고 있는지를 알아내는데 필요하다. 앞서 설명했듯 싱글플레이 환경과 다르게 멀티플레이 환경에서는 다수의 PC(서버, 클라이언트)에서 동작하게 되는데 다음 그림을 한번 확인해 보자

대충 서버와 클라이언트간의 교신

 

여기서 APlayerCharacter::BeginPlay()를 호출하는 상황을 생각해 보자 해당 함수가 서버에서 동작중인지 클라이언트 1에서 동작중인지 클라이언트 2에서 동작중인지 즉 NetMode를 알아야 한다. 이것들을 확인하기 위해서는 NetConnection, NetDriver에 대해서 알아야 한다.