게임 개발 메모장
[ UE5 ] 언리얼 네트워크 멀티 플레이어 프레임워크 본문
https://docs.unrealengine.com/5.1/en-US/networking-overview-for-unreal-engine/
* 네트워크 멀티플레이어 환경 설정
실행 옵션으로 가서 플레이어 한 명으로 지정을 해주는데
여기에 보면 NET MODE 라고 되어 있는 것이 있다.
이 NET MODE 설정을 PLAY AS LISTEN SERVER 라고 지정을 해주고
ViewPort에서 실행한다.
이렇게 설정을 하고 Play 버튼을 누르면 현재 ViewPort에 보여지는 화면은
LISTEN SERVER 라는 서버로 동작을 하게 된다.
여기에서 Shift + F1 키를 눌러서 마우스를 뺀 다음에 여기 기어 아이콘
이것을 누르게 되면 이 서버에 접속하는 클라이언트가 보이는 것처럼 새로운 화면으로 이렇게 추가가 된다.
우리가 원할 때 Shift F1키를 눌러서 마우스를 빼고 이 버튼을 눌러주면 계속해서
새로운 클라이언트가 추가되는 것을 볼 수가 있다.
이 옵션을 켜주면 서버로 동작한 이후에 에디터에 기어 아이콘이 추가가 된다.
그래서 우리가 필요할 때 편하게 원하는 타이밍에 새로운 클라이언트를 생성해 가지고
서버에 접속할 수 있도록 이렇게 설정을 지정할 수 가 있다.
The Client-Server Model
단일 플레이어 또는 로컬 멀티플레이어 게임에서 게임은 독립형 게임에서 로컬로 실행된다.
플레이어는 하나의 컴퓨터에 입력을 연결하고 액터스, 월드, 각 플레이어의 사용자 인터페이스 등
게임의 모든 것을 직접 제어한다.
네트워크 멀티플레이어 게임에서 언리얼 엔진은 클라이언트-서버 모델을 사용한다.
네트워크의 한 컴퓨터는 서버 역할을 하며 멀티플레이어 게임의 세션을 호스팅하는
반면, 다른 모든 플레이어의 컴퓨터는 클라이언트로 서버에 연결된다.
서버는 연결된 각각의 클라이언트와 게임 상태 정보를 공유하고,
이들이 서로 통신할 수 있는 수단을 제공한다.
서버는 게임의 호스트로서 진정하고 권위 있는 게임 상태를 유지한다.
즉, 멀티플레이어 게임이 실제로 진행되는 곳이 서버이다.
클라이언트는 서버에 자신이 소유한 폰을 각각 원격 제어하여
게임 동작을 수행하도록 절차 호출을 보낸다.
즉, 클라이언트가 직접 운직이는 폰을 원격으로 제어를 해서
서버에 신호를 보내주는 역할을 한다는 것
나머지는 모두 다 서버의 콘텐츠가 클라이언트로 복제가 되어서
서버 컨텐츠가 재생이 되는 형태를 가진다.
그러나 서버는 비주얼을 클라이언트의 모니터에 직접 스트리밍하지 않는다.
즉, 서버가 시각적으로 보여지는 그런 화면을 클라이언트로 복제하는 것이 아니라,
게임 상태에 대한 데이터이다.
게임 데이터에 대한 정보를 클라이언트에 복제해서 어떤 액터가
어떻게 변해야 되는지 어떻게 동작 해야 되는지 어떤 변수가 어떤 갑을 가져야 되는지를
알려주는 필요한 데이터를 보내서 그 데이터로 하여금 서버의 콘텐츠를
똑같이 클라이언트에 복제하는 형태로 통신이 진행된다고 이해 하면 된다.
또, 서버는 게임 상태에 대한 정보를 각 클라이언트에게 복제하여
어떤 Actors가 존재해야 하는지, 그 Actors가 어떻게 행동해야 하는지,
그리고 다른 변수가 가져야 하는 가치를 알려준다.
그런 다음 각 클라이언트는 이 정보를 사용하여 서버에서 발생하는 일의
매우 근접한 근사치를 시뮬레이션한다.
왜냐하면 네트워크라는 것이 시간 차도 있고 전송할 수 있는 데이터 양도
한계가 있기 때문에 서버랑 완벽하게 똑같이 만들 수가 없다.
항상 이제 렉이라든지 이런 것들이 발생할 수가 있기 때문에 제한된 정보를
사용해서 최대한 서버와 유사하게 만들어 줘야 되는 그런 메커니즘이 들어가 있다.
그렇게 때문에 근사치를 시뮬레이션 한다.
이것을 이해하기 위한 간단한 도식
Client-Server Gameplay Example
이것이 게임 플레이 프로그래밍 관행을 어떻게 변화시키는지 설명하기 위해,
멀티플레이어 게임에서 두 명의 플레이어의 예가 여기에 있다.
시스템은 이들을 플레이어 1과 플레이어 2로 지칭하며,
이들이 서로 발사체를 발사하도록 하는 과정을 세분화한다.
왼쪽 그림은 로컬 게임 플레이 즉, 네트워크를 사용하지 않는 로컬에서 멀티플레이
오른쪽 그림은 네트워크에서 서버를 중심으로 해서 진행되는 멀티플레이에 대한 시나리오
독립형 게임에서는 이러한 모든 상호 작용이 동일한 기계에서
동일한 세계에서 이루어지기 때문에 이해하기 쉽고 문자 그대로 프로그램된다.
예를 들어 물체를 산란할 때 모든 플레이어가 물체를 볼 수 있다고 당연하게 생각할 수 있다.
네트워크 게임에서 이러한 상호 작용은 서버에 존재하는 상호 작용,
플레이어 1의 클라이언트에 존재하는 상호 작용, 플레이어 2의 클라이언트에 존재하는 상호 작용,
세션에 참여하는 서로 다른 클라이언트에 대한 상호 작용 등 여러 다른 상호 작용에서 발생한다.
각각의 다른 기계에 있는 각각의 세계는 폰의 고유한 복사본, 그들의 무기,
그리고 그들이 발사하는 발사체를 가지고 있다.
서버는 실제로 게임이 진행되는 곳이지만 고객의 세계가 동일한 이벤트가 발생하는
것처럼 보이도록 만들어야 한다.
따라서 서버에 세계를 시각적으로 표현하기 위해 각 클라이언트에 정보를 선택적으로
전송해야 한다.
이 프로세스는 필수 게임 플레이 상호 작용(충돌, 이동, 손상),
미용 효과(시각 효과 및 사운드) 및 개인 플레이어 정보(HUD 업데이트) 간의 구분을 도입한다.
이들 각각은 네트워크의 특정 시스템 또는 시스템 집합과 관련이 있다.
그러나 이 정보를 복제하는 과정이 완전히 자동적인 것은 아니며
게임 플레이를 프로그래밍할 때 어떤 정보가 어떤 기계에 복제되는지 지정해야 한다.
주요 과제는 모든 플레이어에게 일관된 경험을 제공할 수 있도록
복제해야 하는 정보와 복제하는 정보의 양을 최소화하여 네트워크 대역폭을
최대한 적게 사용하는 방법을 선택하는 것이다.
이러한 프로세스에서 또 중요한 점은 모든 정보를 다 보내주는 것은 아니고 필수 게임플레이
상호 작용, 게임 플레이어 정보 이런 것들을 구분해서 전송을 한다는 것이다.
어떤 것은 전송할 필요가 있고 어떤 것은 전송할 필요가 없다는 것이다.
그 이유는 모든 정보를 다 전송을 하면 네트워크라는 것은 대역폭이 한정이 되어 있기 때문이다.
실제로 중요한 정보를 이것 때문에 전송을 못할 수가 있기 때문에 게임플레이에 영향을 미칠
수가 있다.
모든 플레이어에게 일관된 경험을 제공하는 동시에 네트워크 대역폭을 최대한 적게 사용하는 것이
중요하다.
네트워크 대역폭을 적게 사용해야 모든 플레이어에게 더 많은 정보를 전달해서 보다 좋은 게임
플레이 경험을 제공해 준다.
내가 동작시키는 프로그램은 게임 인스턴스라고 하는 클래스가 관리하도록
언리얼 엔진이 설정이 되어있고 이 게임 인스턴스가 만들어 놓은 앱의 테두리 안에 월드라고 하는
이런 콘텐츠가 담기게 된다.
이 월드에는 플레이어를 비롯해서 다양한 액터들이 담겨져 있으며 게임 로직에 의해서
시뮬레이션되고 화면에 나타나게 된다.
이렇게 자기 컴퓨터에서만 실행되는 게임을 어떤 동작 방식의 관점에서 StandAlone 이라고
표현을 하고, StandAlone의 게임 인스턴스가 속한 월드가 곧 게임 콘텐츠가 된다.
여러 대의 컴퓨터를 묶어가지고 게임 서비스라고 하는 거대한 서비스의 개념으로
바라봐야 하는 구조 이 클라이언트 서버 모델은 그림과 같이 특별한 역할을 하는
하나의 서버가 있고 다수의 클라이언트로 구성이 된다.
여기서 서버는 굉장히 강력한 권한을 가지는데,
그렇게 이 서버만 놓고 본다면 이 서버 차제가 실제 컨텐츠 게임 서비스를 제공하는
컨텐츠를 담는 머신이다.
클라이언트 서버 모델에서 이 클라이언트들은 아무런 역할이 없다.
주로 서버에서 전달해주는 접속 커넥션을 통해서 전달해주는 컨텐츠를 복제해서
화면에 띄워주는 역할만 수행한다고 보면 된다.
클라이언트는 이렇게 독립적인 게임 인스턴스를 가지는데
이것은 자기 클라이언트가 있는 컴퓨터 내에서 실행하는 환경만
제공한다고 볼 수 있고 이 안에 담긴 내용은 서버로부터 복제된 허상 컨텐츠라고 보면 된다.
이것을 전문용어로 프록시(대리자 = 복제된 허상) 라고 한다.
이 안에서는 여러가지 액터 중에서 접속을 담당하는 액터를 하나 지정을 한다.
이것이 접속 주체가 된다.
나머지 클라이언트도 동일한 구조를 가지게 된다.
이것이 클라이언트 - 서버 Model
* BP가 아닌 C++ 를 사용 해야하는 이유
'언리얼 엔진 > Network' 카테고리의 다른 글
[ UE5 ] RPC (1) | 2024.01.05 |
---|---|
[ UE5 ] 캐릭터 공격 구현 예시 (0) | 2023.12.30 |
[ UE5 ] 액터 리플리케이션 (0) | 2023.12.25 |
[ UE5 ] 커넥션과 오너십 (0) | 2023.12.25 |
[ UE5 ] 게임 모드와 로그인 (0) | 2023.12.25 |