서로 다른 머신에서 동작하는 게임 사이에서 네트워크를 통해 어떻게 정보 전달이 되는지 다양한 방법을 알아본다. peer-to-peer 모델, client-sever 모델을 알아본 후 언리얼 엔진에서 어떤 모델을 사용하는지 알아본다.
Peer-To-Peer
(생략 3:14)…P2P의 또 다른 문제는 게임의 권위 있는 버전이 없다는 것이다. 게임의 각 인스턴스는 다르다. 플레이어가 캐릭터를 이동할 때마다 게임의 로컬 버전은 이제 다른 컴퓨터의 버전과 다르며 해당 정보가 네트워크를 통해 이동하여 실행 중인 다른 머신의 게임 인스턴스를 업데이트하는데 일정 시간이 걸린다.
Client-Server
(생략 5:12)…서버가 데이터를 클라이언트로 배포하는 것을 replication이라고 한다. Client-Server 모델을 구현하는 서로 다른 방법이 존재한다. 첫 번째 방법은 listen server를 이용한다. 두 번째 방법은 dedicated server를 이용한다.
Dedicated server를 사용하면 서버 시스템이 정식 버전의 게임 시뮬레이션만 처리하고 클라이언트의 대규모 멀티플레이어까지 데이터를 replicate할 수 있다. MMO와 같은 게임은 일반적으로 돈이 관련된 토너먼트를 주최하는 높은 지분 경쟁 게임과 함께 dedicated 서버를 사용한다.
Listen server는 캐릭터를 이동하는 데 서버에 요청을 보낼 필요가 없기 때문에 호스팅 플레이어에게 몇 가지 이점을 제공한다. 호스팅 플레이어는 서버이므로 데이터를 전송하는 데 걸리는 관련 지연 시간이 없다. 그러나 각 클라이언트는 서버에 요청을 보내고 네트워크를 통해 데이터가 다시 replicate될 때까지 기다려야 한다. 대부분의 소규모 게임의 경우 이는 괜찮고 인터넷 연결이 적절하면 그 차이는 무시할 수 있는 경우가 많다. 플레이어의 수가 점점 더 많아질수록 dedicated 서버의 필요성이 더 커진다.
언리얼 엔진은 권위 있는 Client-Server 모델을 사용한다. 이것은 하나의 시스템이 항상 서버 역할을 하고 다른 시스템이 클라이언트로 연결된다는 것을 의미한다. 서버 버전은 신뢰할 수 있는 버전이며 항상 게임의 올바른 버전으로 간주된다.
Net Mode의 Play As Client 옵션은 에디터를 포함한 모든 인스턴스가 client다. 즉 언리얼 엔진에서 내부적으로 dedicated server를 구동시킨다.
Lan 환경에서 두 머신 사이의 테스팅하는 방법은 다음과 같다.
패키징한 빌드 파일을 배포하여 실행한 후, 1키를 누른 (10.0.0.151) 머신이 리슨 서버가 되고, 2키를 누른 클라이언트 머신이 접속할 수 있게 된다.
C++로 LAN 환경의 두 머신사이에서 접속하는 법
UWorld::ServerTravel
virtual bool ServerTravel
(
const FString & InURL,
bool bAbsolute,
bool bShouldSkipGameNotify
)
APlayerController::ClientTravel
void ClientTravel
(
const FString & URL,
enum ETravelType TravelType,
bool bSeamless,
FGuid MapPackageGuid
)