본문 바로가기
Unreal Engine Practice

UnrealEngine 네트워킹,리플리케이트,리플리케이션(2)

by Srff5123 2025. 3. 6.
728x90

1. 클라이언트 오너쉽

네크워크 게임에 있는 폰은 특정 클라이언트 컴퓨터의 플레이어 컨트롤러가 소유한다.

폰이 클라리언트 전용 함수를 호출할 때마다, 소유 플레이어의 컴퓨터로만 전달된다.

함수를 어떤 컴퓨터에서 호출하는지는 상관없다. 오너 변수가 특정 폰으로 설정된 액터는 연관을 통해

해당 폰의 소유 클라이언트에 속한다. 또한 이러한 액터는 클라이언트 전용 함수도 오너의 컴퓨터로 전달된다.

C++에서 IsLocallyControlled 함수나 블루프린트에서 Is Locally Controlled노드를 사용하여 폰이 해당 소유 클라이언트에 속하는지 여부를 결정할 수 있다.

 

2. 관련성 및 우선 순위

관련성(Relevance)은 멀티플레이어 게임 중 액터를 리플리케이트(Replicate : 복제)할 가치가 있는지 여부를 결정하는 데

사용한다

관련 없다고 간주되는 액터는 리플리케이션 중 컬링(Culling)된다.

이렇게 대역폭이 절감되어 관련 있는 액터가 더 효율적으로 리플리케이트될 수 있다.

플레이어가 소유하지 않고 물리적으로 플레이어 근처에 없는 액터는 관련 없는 액터로 간주되어 리플리케이트되지 않는다.

관련 없는 액터는 서버에 존재하고 오소리티 있는 게임 스테이트에 영향을 줄 수 있지만, 플레이어가 근처에 있게 될 때까지 클라이언트에 정보를 전송하지 않는다.

IsNetRelevanFor 함수를 오버라이드하여 수동으로 관련성을 제어할 수 있으며,

NetCullDistanceSquared 프로퍼티를 사용하여 액터가 관련성을 갖는 거리를 결정할 수 있다.

 

게임플레이 단일 프레임 동안 모든 관련 있는 액터를 리플리케이트할 만큼 대역폭이 충분하지 않을 때도 있다

따라서, 액터에는 먼저 리플리케이트 될 액터를 결정하는 우선순위(Priority)값이 있다.

기본적으로 폰과 플레이어 컨트롤러의 NetPriority는 3.0으로, 게임에서 우선순위가 가장 높은 액터이며,

베이스 액터의 NetPriority는 1.0이다.  액터가 리플리케이트되지 않은 시간이 오래될수록, 리플리케이트될 때까지 

각 연속 패스에서 우선순위가 높아진다.

 

3. 변수 리플리케이션(Variable Replication)

C++의 UPROPERTY 매크로에서 Replicated 또는 ReplicateUsing 지정자를 사용하거나,

블루프린트의 디테일(Details) 패널에서 리플리케이트됨으로 지정해 변수 및 오브젝트 레퍼런스에 리플리케이션을

추가할 수 있다.

오소리티 있는 액터에서 리플리케이티드 변수의 값이 변경될 때마다, 해당 정보가 자동으로 오소리티 있는 액터에서 센서에 접속된 원격 프록시로 전송된다.

 

1. RepNotifies

특정 변수의 리플리케이트된 정보를 성공적으로 수신한 액터에 대한 응답으로 호출되는 RepNotify 함수를 지정할 수 있씁니다. RepNotify는 변수가 업데이트될 때 로컬에서만 트리거되므로, 오소리티 있는 액터의 변수 변경에 대한 응답으로 오버헤드가 적게 게임플레이 로직을 트리거하는 방법이다.

이 함수 기능을 이용하려면 C++에서 변수의 UPROPERTY매크로에 있는 ReplicatedUsing 지정자를 사용하거나, 

블루프린트에서 RepNotify를 사용하도록 변수의 리플리케이션 세팅을 변경하면 된다.

 

(RepNotify는 다른 게임플레이 함수 기능과 관계없이 리플리케이트가 필요한 변수에 추가할 수 있어 RPC 또는

리플리케이티드 함수를 사용하는 것보다 선호되며, 추가 네트워크 호출을 생성하는 것에 비해 대역폭을 상당히 절감할 수 있다)

 

4. 원격 프로시저 호출(RPC : Remote Procedure Call)

RPC는 리플리케이티드 함수라고도 부른다.

모든 컴퓨터에서 호출할 수 있지만, 네트워크 세션에 접속된 특정 컴퓨터에서 구현되도록 지시한다.

세가지 타입의 RPC를 사용할 수 있다.

 

서버(Server)  : 게임을 호스팅하는 서버에서만 호출된다.

 

클라이언트(Client) : 함수가 속한 액터를 소유한 클라이언트에서만 호출된다. 액터에 소유 접속이 없으면 이 로직은 실행  되지 않는다.

 

NetMulticast : 서버에 접속된 모든 클라이언트와 서버 자체에서 호출된다.

 

블루프린트의 이벤트와 함수는 디테일 패널의 리플리케이트 드롭다운에서 이 세가지 타입 중 하나로 설정하여 동일하게 지정할 수 있다.

UFUNCTION 매크로에서 서버,클라이언트 또는 NetMulticast지정자를 제공하여 C++의 함수를 RPC로 지정할 수 있다.

코드에서는  _Implementation 접미사를 사용하여 구현할 수 있다.

 

5. 신뢰성

RPC를 신뢰성(Reliable) 또는 비신뢰성(Unreliable)으로 지정해야 한다.

블루프린트에서 함수와 이벤트는 기본적으로 비신뢰성으로 가정된다. 디테일 패널에서 신뢰성 설정을 true로 설정하여

함수를 신뢰성으로 지정할 수 있다. C++에서 서버, 클라이언트 또는 NetMulticast 함수로 상태를 지정하는 것과 함께

모든 RPC의 UFUNCTION 매크로에 지정자를 추가해야 한다.

 

비신뢰성 RPC는 의도한 목적지 도착이 보장되지 않지만, 신뢰성 RPC보다 더 자주, 더 빨리 전송할 수 있다.

비신뢰성 RPC는 게임플레이에 중요하지 않거나 매우 자주 호출되는 함수에 가장 적합하다.

액터무브먼트는 프레임마다 변경될 수 있기 때문에 비신뢰성 RPC를 사용하여 리플리케이트된다.

 

신뢰성 RPC는 의도한 목적지 도착을 보장하며, 성공적으로 수신될 때까지 큐에 남아 있다.

신뢰성 RPC는 게임플레이에 중요하지만, 그렇게 자주 호출되지 않는 함수에 가장 적합하다,

콜리전 이벤트, 무기 발사 시작 또는 종료, 액터 스폰 등이 있다.

신뢰성 함수는 과도하게 사용하면 오버플로우 될 수 있기에 프레임 단위로 리플리케이티드 함수를 호출할 경우는 비신뢰성으로 만들어야 하며, 함수 호출의 빈도를 제한해야 한다.

 

 

 

728x90