(UE5) Property Replication VS RPC 함수

chan·2025년 1월 2일

Unreal Engine5

목록 보기
2/3

언리얼 엔진의 멀티 플레이에서 네트워크 동기화를 위해 사용하는 대표적인 방법으로는 두 가지가 있다.
1. Property Replication
2. RPC(Remote Procedure Call)함수

두 방법은 모두 서버 / 클라이언트 간 데이터 및 이벤트 동기화를 목적으로 하지만 각각 다른 특징을 가지고 있다.
두 방법의 사용 방법과 특징에 대해 알아보자.

Property Replication

Property Replication은 UE5의 네트워크 동기화 시스템에서 가장 기본적인 방식으로,
특정 프로퍼티(변수)를 서버가 자동으로 클라이언트에게 동기화해 주는 기능이다.
자동이라는 말이 키워드로, RPC함수와 가장 다른 점이다.

사용 방법

Property Replicatoin을 사용하기 위해선 반드시 해야하는 두 가지가 있는데,

1. UPROPERTY매크로를 설정

UPROPERTY(Replicated)
float Health;

(선택 사항) RepNotify

값이 업데이트될 때마다 특정 함수를 호출하고 싶다면 ReplicatedUsing=OnRep_Health 와 같이 선언하고 OnRep_Health() 함수를 구현하면 해당 함수는 서버가 변수를 변경하여 클라이언트에 복제될 때마다 자동 호출된다.

UPROPERTY(ReplicatedUsing = OnRep_Health)
float Health;

UFUNCTION()
OnRep_Health();

2. GetLifetimeReplicatedProps 구현

AActor 또는 UActorComponent를 상속받는 클래스에서 오버라이딩하여, 어떤 프로퍼티를 복제할지 설정할 수 있다.

void AMyCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty >& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);

    DOREPLIFETIME(AMyCharacter, Health);
}

Owner에게만 Replicate되게 하는 등 조건부로도 설정할 수 있다.
(출처 - https://dev.epicgames.com/documentation/en-us/unreal-engine/conditional-property-replication?application_version=4.27)

특징

  • 자동화된 동기화 - 변수만 Replicated로 선언하면 엔진이 알아서 클라이언트와 동기화를 처리해주므로 편리하다.
  • 주기적 업데이트 - 언리얼 엔진은 내부적으로 네트워크 프레임마다 복제할 프로퍼티의 리스트를 확인하고, 변경된 값만 전송한다.
  • 복제되는 프로퍼티가 많아질수록 네트워크 트래픽이 증가할 수 있다.
  • 서버에서 값을 변경해야만 클라이언트에 반영된다.

RPC(Remote Procedure Call) 함수

RPC 함수는 서버와 클라이언트가 함수 호출을 통해 서로 이벤트나 로직을 실행시키는 방식을 말한다.
함수에 ‘Server’, ‘Client’, ‘NetMulticast’와 같은 Specifier를 붙여, 함수가 어디에서 실행되어야 하는지 지정해야 한다.
(출처 - https://dev.epicgames.com/documentation/en-us/unreal-engine/rpcs?application_version=4.27)

종류

1. Server RPC (UFUNCTION(Server, Reliable, WithValidation))

클라이언트에서 함수를 호출하면, 그 함수는 서버에서 실행된다.
EX) 무기 발사, 아이템 사용, 데미지 계산 등 ‘서버에서 권한을 가지고 처리해야 하는 로직’에서 사용.

2. Client RPC (UFUNCTION(Client, Reliable))

서버에서 클라이언트 함수를 직접 호출하여, 해당 클라이언트 측에서만 특정 로직이 실행된다.
EX) UI 업데이트, 사운드 재생 등 해당 플레이어 클라이언트에 한정된 이벤트 전달.

3. Multicast RPC (UFUNCTION(NetMulticast, Reliable))

서버에서 함수를 호출하면, 서버와 연결된 모든 클라이언트가 해당 함수를 실행한다.
EX) 이펙트, 월드 이벤트 등 모두에게 보여줘야 하는 이벤트.

사용 방법

  1. UFUNCTION매크로에 원하는 Specifier를 넣어줘야 한다.
  2. ServerRPC에서 WithValidation Specifier를 사용해서 유효성 검사를 할 수 있다.
    (클라이언트가 서버 RPC를 호출할 때 넘어온 파라미터 등이 올바른지 확인(유효성 검사))
  3. Reliable / UnReliable Specifier를 통해 데이터 도달을 보장 / 비보장 할 수 있다.
    (Server, Client, NetMulticast 모두 가능)

Reliable

  • 패킷 유실 방지 - 패킷(함수 호출, 데이터 등)이 전송 중 누락되거나 손실될 경우, 재전송을 통해 반드시 목적지(서버 또는 클라이언트)에 도달하도록 보장한다.
  • 순서 보장 - Reliable RPC나 패킷은 전송 순서 또한 보장된다. 즉, 먼저 보낸 RPC가 나중에 보낸 RPC보다 먼저 도착한다.
  • 오버헤드 증가 - 패킷 손실 시 재전송을 하므로, 트래픽(네트워크 부하)과 지연시간(latency)이 늘어날 수 있다.
    따라서 매우 자주 호출되는 이벤트를 Reliable로 설정하면, 네트워크 성능 저하가 발생할 가능성이 크다.(절대적으로 필요한 이벤트에 쓰는 것이 적합하다.)
  1. 구현부에 _Implementation을 붙여줘야 한다.(유효성 검사를 통과 후 실제 로직을 실행)
UFUNCTION(Server, Reliable, WithValidation)
void ServerMYFunction();

구현부
ServerMYFunction_Implementation()
ServerMYFUnction_Validation()

이번 HAS프로젝트를 진행하면서 RPC함수를 썼던 경우는 다음과 같다.

ServerRPC

  • 스텟, 레벨, XP등 서버에서 관리하는 데이터들을 업데이트 하는 경우.

Client RPC

  • 데미지 텍스트, 마법진, UI와 같이 로컬 클라이언트 화면에서만 보이고 싶은 경우.

Multicast RPC

  • 이펙트, 컷신과 같이 모든 플레이어의 화면에서 보이게 하고 싶은 경우.

ServerRPC -> ClientRPC

  • 서버에서 데이터를 업데이트 한 후, 업데이트한 데이터를 로컬 클라이언트에 업데이트하는 경우.
    EX) 스텟, 스펠 레벨을 올릴 때.

결론

이번 HAS Project를 진행하면서 언리얼 엔진의 멀티 플레이, 네트워크 로직에 대한 이해를 가지게 되었다.
역시 일단 부딪혀봐야 더 빨리 습득하는 것 같다.
※ HAS Project는 Listen Server 환경에서 제작해서 Dedicated Server 환경에서의 개념과 다를 수도 있다.

  • Property Replication

    특정 변수를 서버에서 클라이언트에게 자동으로 동기화”하는 데 사용.
    지속적, 주기적인 값 동기화에 유용.
  • RPC함수

    특정 시점에 이벤트/함수를 호출해 서버-클라이언트 간 로직을 실행”하는 데 사용.
    이벤트성 로직이나 서버 권한이 필요한 행동에 적합.
profile
게임을 사랑하는 개발자 / Unreal Engine5 Client Programmer

0개의 댓글