본문 바로가기
자기개발/Unreal Engine

Network Replication 에 대하여

1. Net Mode

4가지 넷모드가 있다

4가지 넷모드에는 플레이가능한지?, 권한이있는지?, 클라이언트에 열려있는지에 대한 차별점이 있음

게임 실행시 URL을 통해 월드로 로드시키는데 각자 방법이 다름

3가지 게임플레이 유형 (싱글, Listen서버 유형, Dedicated서버 유형)

각 플레이어마다 gameinstance, world를 각자 생성해서 보여주고 Replication을 사용하여 서로 싱크를 맞춤

게임서버와 플레이어는 NetDriver를 사용하여 NetConnection을 하는데 서버는 모든 사용자와 NetConnection이 있지만 플레이어는 서버와의 NetConnection이 있음

그리고 NetConnection에는 여러개의 채널이 있는데 보이스채널, 컨트롤채널, 등... 여러 Actor채널을 가지고 있음

그래서 Replicaton = true 등으로 채널에 Replication이 필요한 엑터를 채널에 추가해주면 서버가 플레이어간 싱크를 맞춰줌

-----여기서 Actor Replicaton에 대한 3가지 사실

1. LifeTime은 서버가 사라지면 플레이어도 사라짐

2. Property (소유권)도 서버에서 변경되면 플레이어도 변경됨

3. RPC(원격 프로시저 호출) 함수를 Multicast RPC로 지정하면 서버에서 해당 함수를 호출하면 서버는 모든 클라이언트도 같이 함수를 호출하도록 함

 

2. OwnerShip (소유권) 에 대하여

모든 플레이어는 고유의 소유권을 가지고 있는데 서버는 소유권을 가지고 있는 PlayerController로 플레이어를 찾을 수 있다  

3. Replication 하는 방법

먼저 Replicate 플래그를 true로 설정해야한다

C++에서는 액터생성자에, 블루프린트는 class default에서 설정 가능 - 런타임에서도 변경가능

4. Relevancy (관련성)

서버는 Relevancy가 있는 플레이어에게만 NetConnection을 이용하여 정보를 나눠주는데 bAlwaysRelevent = true 인 GameState같은 클래스는 모든 플레이어에게 정보를 나눠주고 PlayerController 같은 특정 플레이어게만 Relevency가 있는 경우는 그 관련성있는 플레이어한테만 정보를 줌

5. IsNetRelevantFor  관련성 판단함수

 그리고 Relevency에 대한 정보가 없을때 IsNetRelevantFor 이라는 함수에서 거리, 투명도 같은 것들에 따라서 관련성이 있는지 판단하기도 하다 ( IsNetRelevantFor 수정을 통해 변경가능)

6. NetUpdateFrequency 서버 업데이트 주기

NetUpdateFrequency 가 높을수록 서버에서 업데이트 주기가 많아짐 (높을 수록 좋지만 Bandwidth(대역폭) 의 한계로 완전 부드럽진 않음)

7. RPC = Replicate

모든 함수는 RPC를 사용하여 Multicast를 할 수 있는데 Reliable = 중요한 정보일떄 체크 신뢰가능 , UnReliable = 대역폭 포화로 정보 도착못할 수 도 있음 (대역폭 포화를 조금 줄여줘서 패킷 손실, 병목현상등 막아줌)

프로퍼티 리플리케이션과 RPC 사이의 큰 차이점은, 프로퍼티는 변경될 때마다 자동으로 리플리케이트되는 반면, RPC 는 실행될 때만 리플리케이트된다는 점입니다.

리플리케이트시켜야 하는 프로퍼티 유형의 좋은 예라면, 액터의 생명력(health)을 들 수 있습니다. 이런 것은 변할 때마다 클라이언트에서 알았으면 좋겠지요. 생명력 값이 변하지 않으면, 아무것도 전송되지 않습니다. 매우 효율적이지요. 하지만 유념할 것은, 이 프로퍼티가 변하지 (그래서 대역폭을 차지하지) 않더라도, 이 값이 변했는가 아닌가 결정하는 데 드는 CPU 비용은 있다는 점입니다. 즉 자주 변경되는 프로퍼티에 맞춰져 있습니다.

8. AUTHORITY 권한

서버는 모든 권한을 가지고 플레이어는 AutonomousProxy (완전한 권한을 가지고 있지 않더라도 배우의 움직을 제어)를 가지고 다른 플레이어에 대한 SimulatedProxy를 가짐

9. 멀티플레이어 게임의 GameFrameWork

10. 4가지 경우

--1) Server Side : 데미지, 스폰, replicated 업데이트 등..

2) Cline Side : replicated 된 값 초기화

3) ViewPort Only : 파티클, 오디오 (데디케이티드 서버일떄)

4) Player Only : UI 업데이트, 플레이어의 도움말 등 (ListenServer, 로컬플레이어 일떄)

 

출처 : https://youtu.be/JOJP0CvpB8w

 

 

'자기개발 > Unreal Engine' 카테고리의 다른 글

언리얼의 Game Framework에 대하여  (0) 2021.07.29
Actros, Components에 대하여  (0) 2021.07.29
언리얼에서 모듈이란  (0) 2021.07.18
언리얼에서의 함수  (0) 2021.07.18
Coding Standard  (0) 2021.06.23