UE - 네트워크 다시 공부
UnrealEngine
언리얼 엔진 네트워크 개요
언리얼 엔진은 Server-Client
구조를 사용한다.
Server
로 정의된 인스턴스가 게임의 상태에 대한 Authority
(권한) 를 가지며, Client
들이 Server
의 정보를 받아 업데이트하는 방식이다.
Client
끼리는 직접 통신하지 않고, 서버를 거쳐 통신한다.
언리얼 네트워크 클래스 역할
가장 모호했던 부분이였는데, 좀 갈피를 잡은 것 같다.
특정 클래스들은 서버에서만 존재하거나 접근에 제한이 있다.
클래스 | 존재 위치 | 역할 |
---|---|---|
GameMode | Server | 게임 규칙 제어 |
GameState | Server와 모든 Client | 게임의 전체적인 정보(e.g. 점수, 시간) 동기화 |
PlayerController | Server와_자신을 소유한 Client_ | 각 플레이어의 입력은 자기 Client와 Server에만 알 수 있음 |
Pawn | Server와 모든 Client | 모든 플레이어가 자신 외의 Pawn도 볼 수 있도록 Server에 Replicate |
GameMode
는 서버에서만 존재한다.
PlayerController
는 자신을 소유한 클라이언트와 서버만 접근 가능하다.
Pawn
은 모든 클라이언트에서 접근 가능하다.
컨트롤러는 소유자만 접근이 가능한데 왜 Pawn
은 접근이 허용되는지 이해가 어려웠는데, 설명을 들어보니 다른 클라이언트에서도 보여야하기에 접근이 가능하다고 한다.
이렇기 때문에 게임의 진행은 서버에서만 컨트롤이 가능하며, 클라이언트들은 자신이 소유한 컨트롤러를 다른 클라이언트에게 보호할 수 있다.
물론 P2P 서버의 경우 방장이 서버이므로 접근이 가능하다.
Replication
Replication
은 서버에서 클라이언트로 특정 변수나 객체의 상태를 자동 동기화하는 기능이다.
이번 과제에서 이 부분에서 문제가 있었는데, 서버에서 컨트롤러마다 id
를 부여했지만 Replication
을 사용하지 않아 클라이언트에게는 빈 값으로 들어갔던 문제가 있었다.
이처럼 계속 변할 수 있고, 변수로 저장하는 데이터들을 동기화할 때는 Replication
을 사용하는 것이 좋다고 한다.
위에서 설명한 user id 말고도 플레이어의 위치나 체력 등에서도 사용한다.
Replication은 서버에서 클라이언트에게 전달하는 단방향 통신만 지원한다.
값의 동기화만 지원하기에 이벤트처럼 사용하려면 RepNotify를 사용해야한다.
또한 GetLifetimeReplicatiedProps()
함수에서 어떤 변수를 복제할지 설정을 해줘야 작동한다.
RCP
RPC
는 원격 머신에서 함수를 호출하는 명시적인 방법이라고 정의할 수 있다.
RPC는 Replication과 달리 “값”이 아니라 “함수 호출”을 동기화하는 개념이다.
3가지 RPC가 존재한다.
- Server는 클라이언트가 서버에게 함수 호출을 요구할 때 사용하는
RPC
- Client는 서버가 특정 클라이언트에게 함수 호출을 요구하는
RPC
- Multicast는 서버에서 호출해 서버와 모든 클라이언트에서 호출되는
RPC
Multicast는 저번 스터디에서 테스트한 내용이 기억에 남는데, 클라이언트에서 Multicast를 실행하면 해당 클라이언트에서만 작동했었다.
RCP의 경우 함수 호출로 구현되기에 일회성 이벤트와 같은 사용방식으로 이용한다. 또한 호출할 때마다 패킷을 생성한다고 한다. 패킷은 크면 클수록 좋지 않기에 이 부분을 신경써야 할 것 같다.
Replication, RCP의 차이</sapn>
- 통신 방향
Replication
은 서버->클라이언트 단방향 통신RPC
는 양방향 통신.
- Automatic vs Manual
Replication
은 값이 바뀌면 자동으로 동기화.RPC
는 명시적으로 호출이 필요.
- 순서
Replication
은 한 번에 뭉쳐서 보내 순서를 보장하지 않음.RPC
는Reliable
,Unreliable
로 순서를 보장할 지 결정할 수 있음.