내일배움캠프 72일차 - 언리얼 엔진 C++ 멀티플레이어: 서버의 종류와 데디케이티드 서버

서버의 종류

P2P Server(Peer to Peer Server)

친구와 데이터를 주고받으면서 만들어진 서버 구조.
각각의 컴퓨터클라이언트이자 서버인 형태를 띠고 있다.

데이터를 주고 받을때, 전송할 때는 서버가 되고 전송 받을 때는 클라이언트가 되는 식이다.
게임에서 활용될 때는 매치메이킹만 회사서버에서 담당하고, 이후 매칭된 유저끼리 서버가 되어 데이터를 주고받는다.

ex) 비트토렌트, 다크소울, 스타크래프트1 등

Listen Server

방장(Host)서버클라이언트를 겸하고, 나머지 참가자(Guest)는 모두 클라이언트 역할만 맡는 서버 구조.

ex) 마인크래프트, 어몽어스

Dedicated Server

컴퓨터 하나서버를 전담하고 나머지 유저클라이언트 역할만 하는 서버 구조.

ex) 배틀그라운드

언리얼 Dedicated Server의 실행 흐름도

에디터에서 실행을 하거나(PIE, Play In Editor), 서버.exe를 수동으로 실행하는 등 프로그램을 실행하면 서버 프로세스가 실행.

실행 시 Open {레벨명}?Listen 명령어가 실행되어 해당 레벨을 열어둔다.

이때 Listen이라는 명령어 인자로 인해 Socket이 생성되며 이로 인해 다른 클라이언트간의 연결이 가능해진다.

열린 Level에는 월드세팅이 있고, 그 안에는 GameModeGameState정보가 있어 이를 통해 두 액터를 생성한다. 이때, GameMode 액터는 서버가 되는 컴퓨터에만 생성된다. (GameMode = Server)

클라이언트서버퍼블릭 IP주소포트 번호로 접속을 시도. 서버클라이언트에게 Level정보를 넘기고, 클라이언트Level을 여는데 성공하면 서버에게 알린다.

이후에 서버와 클라이언트 간의 패킷정보를 주고받는 과정에서 서버는 GameState와 함께 해당 클라이언트 전용 PlayerState, PlayerController, PlayerCharacter 등 여러가지 액터를 생성하고 복제본을 해당 클라이언트에게 전달한다.

같은 방법으로 다른 클라이언트가 접속하면 그 클라이언트에게도 GameState액터들복제해 전달한다.

이때, 각 클라이언트 간의 PlayerStatePlayerCharacter도 복제되면서 서로가 보이게 된다.

※특이사항: GameMode데디케이티드 서버에만 있고, 서버 외의 클라이언트에는 자신만의 PlayerController만 존재한다.

서버-클라이언트 구조의 아주 중요한 특징

1) 그림에서 볼 수 있듯, 클라이언트클라이언트 간의 통신이 불가능하다.

2) 오직 서버클라이언트 사이의 통신만 가능하다.

3) 이것이 이후 RPC(Remote Procedure Call)프로퍼티 레플리케이션에도 영향을 끼친다.


실습환경 구축

환경설정 및 기존 위젯오류 수정

1) 플레이 설정에서 '플레이어 수', '넷 모드'를 설정할 수 있다.

2) 만약 내 컨트롤러에만 표시될 위젯다른 컨트롤러에도 표시되면 해당 오류메세지를 띄운다.
다른 캐릭터가 쓰러졌을때 YOU DIE가 나에게 뜨는 것과 비슷한 상황.

3) 해당 문제를 해결하려면 플레이어 컨트롤러에서 위젯을 생성할 때 위의 판별코드를 부여한다.

Run Under One Process 체크해제

현재 상태에서 게임을 실행하면 멀티플레이 코드는 추가하지 않았는데 채팅이 다른 클라이언트에서도 보이는 현상을 볼 수 있다.

이는 Run Under One Process 속성으로 발생한 상황이다. 하나의 언리얼 엔진 프로세스 위에서 모든 로직이 돌다보니, PrintString()도 모든 화면에서 뜨는 것으로, 멀티플레이 코드를 추가하지 않았기 때문에 정상적인 상황은 아니다.

실제 멀티플레이어 환경을 실습하려면 Run Under One Process 속성을 false로 체크해주면 된다.

이는 에디터 개인설정에서 위 옵션을 해제함으로서 해결할 수 있다.

Run Under One Process를 해제하고 실행해보면 위 사진과 같은 결과를 얻을 수 있다.

여기서 왼쪽이 데디케이티드 서버로, Join successed를 두 번 출력함으로서 두 클라이언트가 모두 준비되었음을 알 수 있다.
또한 클라이언트의 채팅다른 클라이언트에게 보이지 않게 되었다.

Allow Late Joining 체크

위 옵션을 체크해주면 런타임 중에 다른 클라이언트를 추가할 수 있다.

Allow Late Joining이 활성화 되는 중에는 플레이 중 해당 아이콘이 활성화 된다.

Always on top 체크 (선택)

위 옵션을 체크하면 0번 클라이언트 화면이 항상 위에 뜬다.

Launch Separate Server 체크

위 옵션을 체크하면 서버 콘솔창을 따로 띄운다.

체크를 하지 않을 시 0번 클라이언트(에디터 화면)클라이언트이자 서버를 겸하게 된다.

멀티플레이어 에디터 환경설정 요약

 - Allow Late Joining
 : 체크 시 런타임 중 다른 클라이언트를 추가할 수 있도록 설정.

 - Launch Separate Server
 : 체크 시 데디케이티드 서버 콘솔창을 따로 띄운다.
 : 미체크 시 0번 클라이언트(에디터 화면)이 클라이언트와 서버를 겸한다.

 - Run Under One Process
 : 체크 시 같은 프로세스 내라서 공유하는 에셋이 생김
 → 따라서 확실한 멀티플레이 환경이라고 보기엔 무리가 있음.
 → 멀티플레이 디버깅 시 체크하고 로깅을 찍어볼 수 있음.
 : 미체크 시 서버와 각 클라이언트들이 다른 프로세스로 분기됨
 → 실제 멀티플레이 환경에 가까움

 - "Net Mode"는 "Play as Client"로 설정

 - 플레이 버튼 우측에 세부설정을 통해 Number of Players(멀티플레이어 인원)을 설정할 수 있음.

댓글

이 블로그의 인기 게시물

내일배움캠프 사전캠프 - 사전캠프설 연휴 커피 파밍 이벤트 작품 [ EXTREMITY ]

내일배움캠프 29일차 - 커리어데이 2일차 : 클라이언트 프로그래머로서 포트폴리오, 입사준비팁