[Unreal] 25.언리얼 멀티플레이
본 문서는 어소트락 언리얼엔진 게임프로그래머 양성과정의 강의를 토대로 필기한 내용입니다
UE 멀티 플레이어 시스템
멀티 플레이어 게임은 동일한 게임의 여러 인스턴스가 동시에 실행되는 것을 목표로 한다
- 동일한 시스템의 다른 프로세스
- 동일한 로컬 네트워크의 다른 컴퓨터
- 인터넷을 통해 서로 다른 위치에 존재하는 플레이어
- 언리얼 엔진의 네트워크 모델에서 플레이어는 서버 연결 상태를 유지하고, 서버는 월드를 신뢰할수 있는 상태로 유지
- 서버에서 변경 사항이 발생하면 해당 변경 사항은 리플리케이션(Replication) 이라는 프로세스의 일부로 필요에 따라 클라이언트에 전파된다
- 리플리케이션 시스템은 게임 코드와 통합되어 멀티 플레이어 게임을 쉽게 개발하도록 해줌
- 통신을 통해 토켓을 따로 열거나 패킷을 보내지 않아도 되며, 데이터 직렬화(Serealization) / 인코딩(Encoding) / 바이트 순서 / 타임스탬프 / 재정렬 및 라우팅(Routing) 등을 처리하지 않고, 단순히 해당 프로퍼티를 복제하기를 요구하면 복제되는 시스템
넷 모드
월드의 속성으로 네 가지의 모드(StandAlone / Dedicated Server / Listen Server / Client)가 존재하며, 세 가지 질문 통해 모드를 나눌 수 있다
월드의 NetMode는 게임 인스턴스가 시작된 방식에 따라 달라진다
- Playable
- 게임을 플레이할 수 있는가?
- 게임 인스턴스에 LocalPlayer가 존재하고, 해당 플레이어의 입력을 처리하고, 월드를 뷰포트로 렌더링하고 있는가?
- Autority?
- 우리는 서버인가?
- 게임 인스턴스에 GameMode 액터가 포함된 World의 정식 사본이 있는가?
- Open To Clients?
- (우리가 서버라면) 원격 연결 시도를 위해 열려있는가?
- 다른 플레이어가 클라이언트로 참여해 게임을 플레이 할 수 있는가?
Standalone
게임 인스턴스가 로컬로 맵을 로드한 경우, 게임 월드의 넷 모드는 Standalone이 된다.
- 단일 게임 인스턴스는 서버이자 클라이언트이지만, 단일 플레이어 구성에서 실행되기 때문에 다른 클라이언트가 연결할 수 없다
- URL은 맵 이름 혹은 경로
Dedicated Server
로컬 플레이어와 뷰포트가 없는 게임 인스턴스. 플레이어가 클라이언트로 연결할 수 있는 서버 전용 콘솔 응용 프로그램으로서 작동
- 사운드, 그래픽, 사용자 입력 등 플레이어 관련 기능을 제거하여 효율적인 실행이 가능한 서버
깃허브에서 데디케이트 서버를 다운 받아서 사용 할 수 있다
- 사용 방법
- 설치
- 깃허브 UE 계정 연동 및 코드 다운로드
Setup.bat으로 셋업GenerateProjectFiles.bat으로 솔루션 생성- 엔진 풀코드 전체 빌드
ctrl + shift + B UnrealEditor.exe로 실행 (서버 기능도 포함한 언리얼 에디터)
- 데디케이트 버전으로의 변환
- switch Unreal Engine version
[프로젝트].Target.cs버전을 동기화 해준후[프로젝트].ServerTarget.cs서버 타겟에 대한 세팅 후 빌드
- 설치
Listen Server
유저 중에 한명이 서버가 되는 구조
- 맵을 로컬로 로드하지만 경로에 ?Listen 옵션을 추가하여 로드한 경우 Standalone과 동일하지만 다른 클라이언트가 참여할 수도 있다
- URL 은 맵 경로?Listen
Client
게임 인스턴스가 원격 서버로 연결된 경우
- 게임은 로컬 플레이어가 플레이 할 수 있지만, 서버 요청에 따라 월드가 업데이트 된다
- 서버가 아닌 유일한 모드로 서버측의 로직이 실행되지 않음
- URL은 IP 주소
언리얼 엔진의 네트워킹 시나리오
- 싱글 플레이어
- 하나의 게임 인스턴스가 있고, 해당 월드는 Standalone 모드에서 실행 됨
- 멀티 플레이어
- 각각 고유한 게임 인스턴스들이 있고, 고유한 World 복사본이 있는 여러 프로세스가 있다
- 이러한 프로세스 중 하나는 Listen Server 또는 Dedicated Server
리플리케이션
서버와 클라이언트 사이에서 데이터와 명령을 주고 받는 프로세스
액터 업데이트 방식은 크게 두 가지
- 프로퍼티 업데이트
- RPC(Remote Procedure Call)
언리얼 주요 클래스 생성
- GameMode : 서버에만 생성
- PlayerController : 서버, 클라이언트 생성
- PlayerPawn : 서버, 클라이언트 생성 //
- PlayerState : 서버, 클라이언트 생성 //
- PlayerAnimInstance : 서버, 클라이언트 생성
- GameState : 서버, 클라이언트 생성