안선생의 개발 블로그
[UE5]멀티플레이 클라이언트와 서버 관계 본문
멀티플레이어를 만드는 이유
언리얼 엔진에서 멀티플레이어용으로 프로그래밍한 모든 게임플레이는 싱글 플레이어에서도 작동합니다.
하지만 싱글플레이용으로는 멀티플레이 게임은 작동하지 않습니다. 멀티에서 싱글은 가능하지만 싱글에서 멀티플레이로 전환은 불가능합니다. 프로젝트 후반에 네트워킹을 도입하는 것은 처음부터 계획하는 것보다 리소스가 많이 들고 번거로운 일입니다. 따라서, 멀티플레이어 기능이 절대 필요 없는 프로젝트라는 확신이 없는 한, 항상 멀티플레이어용으로 프로그램하는 것이 좋습니다.
클라이언트-서버 모델
싱글 플레이어 게임이나 로컬 멀티플레이어 게임에서는, 게임이 독립형 게임으로 로컬에서 실행됩니다. 플레이어가 단일 컴퓨터에 입력을 연결하고 해당 로컬 컴퓨터에서 액터와 월드, 각 플레이어의 유저 인터페이스 등, 게임의 모든 것을 직접 제어합니다.
싱글 플레이어와 로컬 멀티플레이어는 하나의 컴퓨터에서만 실행됩니다.
네트워크 멀티플레이어 게임의 경우 언리얼 엔진은 클라이언트-서버 모델을 사용합니다. 네트워크에 있는 하나의 컴퓨터가 서버 가 되어 멀티플레이어 게임 세션을 호스팅하고, 서버에 접속한 다른 모든 플레이어의 컴퓨터는 클라이언트 가 됩니다. 서버는 접속된 각 클라이언트와 게임 스테이트 정보를 공유하고 서로 통신할 수 있는 수단을 제공합니다.
서버 (Server):
- 모든 플레이어의 행동 및 이벤트를 처리합니다.
- 서버는 게임 세션을 호스팅하고, 게임의 규칙과 상태를 관리합니다.
- 클라이언트들로부터 수신한 입력 및 동작을 처리하고, 클라이언트들 간의 통신을 조율합니다.
- 서버는 게임의 일관성과 공정성을 유지하며, 클라이언트들이 동일한 게임 경험을 공유할 수 있도록 돕습니다.
클라이언트 (Client):
- 클라이언트는 게임을 플레이하는 실제 플레이어를 나타냅니다.
- 각 플레이어가 게임을 플레이하는 독립된 게임 인스턴스를 실행하며, 그들의 로컬 컴퓨터에서 게임을 렌더링하고 실행합니다.
- 클라이언트들은 서버로부터 게임 상태 및 업데이트를 수신하고, 사용자 입력 및 동작을 서버로 전송하여 다른 플레이어들과 상호작용합니다.
클라이언트들은 서버로부터 데이터를 수신하고 서버에 데이터를 전송하여 게임 세계에서 상호작용합니다. 서버는 게임의 상태를 관리하고, 모든 플레이어 간의 동기화를 유지합니다.
클라이언트-서버 게임플레이 예시
예시: 총격 게임
- 서버 설정:
- 게임 시작 시, 한 플레이어가 서버로 호스팅합니다.
- 서버 플레이어는 게임 상태를 관리하고, 다른 플레이어들과의 상호작용을 조정합니다.
- 클라이언트 참여:
- 다른 플레이어들은 서버에 연결하여 게임에 참여합니다.
- 각 클라이언트는 서버로부터 게임 상태를 수신하고 플레이어 조작을 보여줍니다.
- 플레이어 이동 및 총격:
- 클라이언트에서 감지된 키 입력은 서버로 전송됩니다.
- 서버에서는 이 입력을 기반으로 플레이어의 이동, 총격, 점프 등을 처리합니다.
- 동기화:
- 서버는 플레이어들 간의 위치, 총알 발사, 피격 등 게임 상태를 동기화합니다.
- 서버에서 게임 상태가 변경될 때마다 이 정보를 모든 클라이언트에게 전송하여 동기화합니다.
- 총알 충돌 판정:
- 플레이어가 총을 쏘면, 서버에서 총알의 충돌 여부를 판단하고 적에게 피해를 입힙니다.
- 충돌 여부와 피해량은 서버에서 결정되며, 클라이언트는 이 정보를 받아 화면에 표시합니다.
- 게임 종료 및 결과 표시:
- 게임이 종료되면, 서버는 결과 정보를 클라이언트에게 전송합니다.
- 클라이언트는 이 결과를 받아 승리자를 표시하거나 결과 화면을 표시합니다.
네트워크 모드 및 서버 타입
네트워크 모드설명
독립형(Standalone)
게임이 원격 클라이언트 접속을 허용하지 않는 서버로 실행됩니다. 게임에 참여하는 모든 플레이어는 로컬 플레이어뿐입니다. 이 모드는 싱글 플레이어 및 로컬 멀티플레이 게임에 사용됩니다. 서버 측 로직과 클라이언트 측 로직 모두를 로컬 플레이어에 맞게 실행합니다.
플레이화면에서는 로컬플레이어마꺠 안보이는 걸 알 수 있다.
클라이언트(Client)
게임이 네트워크 멀티플레이어 세션으로 서버에 접속된 클라이언트로 실행됩니다. 어떠한 서버 측 로직도 실행하지 않습니다.
리슨 서버(Listen Server)
게임이 네트워크 멀티플레이어 세션을 호스팅하는 서버로 실행됩니다. 원격 클라이언트의 접속을 허용하며, 서버에 바로 로컬 플레이어가 있습니다. 이 모드는 가벼운 협동 및 경쟁 멀티플레이어에 자주 사용됩니다.
로컬플레이가 있고 서버와 클라인언트가 하나씩 있는것을 볼 수 있습니다.
데디케이티드 서버(Dedicated Server)
게임이 네트워크 멀티플레이어 세션을 호스팅하는 서버로 실행됩니다. 원격 클라이언트의 접속을 허용하지만, 로컬 플레이어는 없습니다. 따라서, 더 효율적인 운영을 위해 그래픽, 사운드, 입력 및 기타 플레이어 중심 기능을 버립니다. 이 모드는 높은 지속성이나 보안, 대규모 멀티플레이어가 필요한 게임에 자주 사용됩니다.
로컬 플레이가 없는것을 알 수 있습니다.
리슨 서버 vs 델리게이트
- 리슨 서버 (Listen Server):
- 리스닝 서버는 게임 호스트가 동시에 서버 역할을 수행하는 모드입니다.
- 게임을 시작한 플레이어(호스트)는 서버로서 게임 세션을 만들고 다른 플레이어(클라이언트)를 허용합니다.
- 호스트는 게임 세션을 관리하며 게임 규칙 및 게임 내 상태에 대한 권한을 가집니다.
- 일반적으로 작은 규모의 게임에서 사용됩니다.
- 소규모 플레이어 그룹이 즐기는 가벼운 협동 및 경쟁 멀티플레이어용으로는 매우 편리
- 데디케이티드 서버 (Dedicated Server):
- 데디케이티드 서버는 별도의 서버 인스턴스가 게임을 호스팅하는 모드입니다.
- 게임 호스트와 서버가 별개의 엔티티로 존재하며 서버는 게임 세션을 관리하고 게임 규칙을 엄격히 시행합니다.
- 클라이언트는 데디케이티드 서버에 연결하여 게임을 플레이하며 서버는 게임 상태를 유지합니다.
- 대규모 게임이나 공식 대회와 같이 경쟁이 더 필요한 상황에서 사용됩니다.
- 보안이나 공정성, 안정성 때문에 신뢰할 수 있는 서버가 필요하거나 고성능이 필요한 게임, 많은 수의 플레이어가 필요한 게임용으로 데디케이티드 서버가 선호
- 게임에는 MMO, 경쟁적인 MOBA, 빠르게 진행되는 온라인 슈팅 게임 등
리슨 서버는 게임을 직접 플레이하면서 동시에 서버 역할을 하며, 데디게이트 서버는 게임을 호스팅 및 관리하는 전용 서버입니다. 어떤 서버를 사용할지는 게임의 규모와 요구 사항에 따라 다르며, 일부 게임에서는 리슨 서버와 데디게이트 서버를 혼합하여 사용하기도 합니다.
아래 공식 문서를 참고하여 작성했습니다.
https://docs.unrealengine.com/5.3/ko/networking-overview-for-unreal-engine/
네트워킹 개요
멀티플레이어용 네트워크 게임 구성하기
docs.unrealengine.com
'언리얼 > 멀티플레이' 카테고리의 다른 글
[UE5] 언리얼 자체 리플리케이션?? (1) | 2023.11.05 |
---|---|
[UE5] RPC (0) | 2023.11.04 |
[UE5] 변수 리플리케이션 (0) | 2023.11.03 |
[UE5] Network Role (0) | 2023.11.01 |
[UE5] 멀티플레이 Seamless Travel (3) | 2023.10.29 |