서버는 게임의 중앙 관리자 역할을 합니다. 클라이언트들의 요청을 받아 처리하고, 게임의 상태를 유지하며, 모든 클라이언트에 일관된 데이터를 전달하는 역할을 합니다.
1). 리슨 서버 (Listen Server)
서버가 한 클라이언트와 동일한 프로세스에서 실행됨
작은 규모의 게임에서 사용되며, 호스트 플레이어가 게임을 종료하면 서버도 종료됨
2). 전용 서버 (Dedicated Server)
게임을 실행하는 클라이언트가 존재하지 않는 독립적인 서버
안정적이며 대규모 멀티플레이어 게임에서 사용됨
게임 로직을 실행하지만 그래픽을 렌더링하지 않음
클라이언트는 서버에 연결하여 게임을 플레이하는 개별 플레이어입니다. 클라이언트는 서버로부터 게임 데이터를 받아 화면에 렌더링하며, 플레이어의 입력을 서버에 전달합니다.
Unreal Engine은 멀티플레이어 게임에서 Server-Client 구조를 사용합니다.
이는 Server로 정의된 인스턴스가 게임의 상태에 대한 Authority을 가지며, 다른 모든 인스턴스는 Server로부터 업데이트를 받는 Client임을 의미한다
Client들 끼리는 직접 통신하지 않고 Client가 취하는 모든 행동은 Sever로 전송이 되서 검증을 받고난뒤 다시 Client로 뿌려진다음 실행 하게 된다
즉 Sever는 게임의 모든 최종결정을 내리며 이런 이유는 일관성을 유지하고 Cheat를 방지하기 위해서고 항상 "Never Trust the Client”라는 보편적인 원칙이 있다고하네요
언리얼 엔진에서는 RPC (Remote Procedure Call)을 사용하여 서버와 클라이언트 간 데이터를 주고받습니다.
서버-클라이언트 통신 방법
클라이언트 → 서버 (Server RPC)
클라이언트가 서버에게 특정 요청을 보낼 때 사용
실행위치 : 서버
보통 유저 요청 전달
예: "플레이어가 공격 버튼을 눌렀습니다!" → 서버가 공격을 처리
서버 → 클라이언트 (Multicast RPC)
서버가 여러 클라이언트에게 동기화된 데이터를 보낼 때 사용
실행위치 : 모든 클라이언트 및 모든 서버
보통 시각효과, 소리등 게임진행을 하다가 게임에 접속하고 있는 모든 플레이어들 한테 정보전달을 해줘야할 때
예: "이 적이 죽었습니다!" → 모든 클라이언트가 동일한 장면을 렌더링
서버 → 특정 클라이언트 (Client RPC)
실행위치: 특정 클라이언트
보통 Ui업데이트 알림 등 특정 플레이어 피드백 전달 할 때
서버가 특정 클라이언트에게만 데이터를 전송할 때 사용
예: "너의 체력이 20 남았어!"