멀티플레이어 게임 개발 5 (Replication)

김여울·2025년 9월 4일

내일배움캠프

목록 보기
69/139
post-thumbnail

레플리케이션(Replication)

  • 생성된 액터의 정보를 네트워크 내 다른 클라이언트에게 복제하는 작업
  • 기본 규칙 : 서버-클라이언트 모델에서는 서버 → 클라이언트로 복제

RPC (Remote Procedure Call)

  • 쌍방 호출 가능 (Client↔Server)

  • 호출자(Client/Server) → 수신자(Server/Client)에게 함수를 원격 실행시키는 방식
    (예) Server RPC, Client RPC, Multicast RPC

Property Replication

  • 일방향(서버→클라)

  • Server → Client 로만 데이터가 복제됨

  • 클라에서 값을 바꾸더라도 그대로 서버에 반영되지 않음

  • 클라이언트가 값 변경을 원하면 → Server RPC를 호출해서 서버에 전달해야 함

  • 그리고 그 값이 Replicated로 설정돼 있으면 → 다시 Server → Client 방향으로 전체 클라에 복제됨

1 RPC(Remote Procedure Call)

📎 Epic Games Developer

1.1 설명

  • 로컬에서 호출되지만 (호출하는 머신과는) 다른 머신에서 원격 실행되는 함수

  • 네트워크 연결을 통해 클라이언트와 서버 사이에 메시지를 전송

  • 게임에 큰 영향을 끼치지 않는 일시적인 효과들에 사용
    (예) 사운드 재생, 파티클 스폰, 액터의 핵심적인 기능과는 무관한 일시적 효과
    → 게임에 큰 영향을 끼치는 것들은 이후에 배울 프로퍼티 레플리케이션

1.2 사용

UFUNCTION 선언에 Server, Client, NetMulticast 키워드를 붙여주기

서버 (호출) → 클라이언트 (실행)

UFUNCTION( Client )	
void ClientRPCFunction();

클라이언트 (호출) → 서버 (실행)

UFUNCTION( Server )
void ServerRPCFunction();

서버 (호출) → 연결된 모든 클라이언트 (실행)

UFUNCTION( NetMulticast )
void MulticastRPCFunction();

1.3 주의사항

RPC 의 정상 작동을 위해 충족시켜야 하는 요건

  1. Actor 에서 호출되어야 함

  2. Actor 는 반드시 replicated여야 함

  3. 서버 (호출) → 클라이언트 (실행) RPC의 경우, 해당 Actor 를 실제 소유하고 있는 클라이언트에서만 함수가 실행

  4. 클라이언트 (호출) → 서버 (실행) RPC의 경우, 클라이언트는 RPC가 호출되는 Actor 를 소유해야 함

  5. Multicast RPC는 예외:

    • 서버에서 호출되는 경우,
      → 서버에서 로컬로 실행 + 현재 접속 중인 모든 클라이언트에서도 실행

    • 클라이언트에서 호출되는 경우,
      → 로컬에서만 실행됨, 서버에는 실행되지 않음

    • 멀티캐스트 이벤트 전송 제한(Throttle)

      • 한 Actor의 네트워크 업데이트 주기 동안 최대 2번까지만 복제됨 (남발 방지용)
      • 장기적으로는 채널 간 트래픽 관리와 더 정교한 전송 제한 기능을 지원할 계획임

1.4 Call & Invoke

Call

  • 컴파일 타임에 어떤 함수인지, 호출하는 곳 & 실행하는 곳 정해져야 함 (정적)
  • 일반적인 전역 함수와 멤버 함수 해당
    → 직접적으로 함수를 호출하고 실행

Invoke

  • 런타임에 어떤 함수인지, 호출하는 곳 & 실행하는 곳 정해져야 함 (동적)
  • 함수 포인터, 동적 바인딩, RPC
  • 간접적으로 함수를 호출하고 실행
    → RPC도 마찬가지로 "RPC를 Invoke" 라고 표현

Run 호출하는 곳 Invoke 실행하는 곳

1.5 WithValidation

  • 서버에서 실행되는 RPC 보안용 키워드

  • 작성 시 함수가 _Implementation() + _Validate() 두 개로 나뉨

  • _Validate() → 실행 여부 판단 (위변조 방어막)

  • _Implementation() → 실제 실행 로직

  • _Validate() 가 false 반환하면 → 밴 처리 가능

1.6 Reliable & UnReliable

기본값은 Unreliable (안 쓰면 자동으로 이거)

Unreliable

  • 실행 보장 ❌ (부하 줄임)
    (예) 코스메틱 요소 (이펙트, 사운드 등)

Reliable

  • 실행 보장 ⭕
    (예) 충돌, 데미지, 스폰 같은 핵심 로직

2 Property Replication

2.1 설명

  • 원하는 속성만을 다른 클라이언트에게 복제하는 것

  • 액터의 모든 속성의 변경된 값을 모든 클라이언트에게 복제하는 것은 비효율적

2.2 설정 방법

1) 액터의 Replicates 속성 활성화

bReplicates = true;

→ 이 액터 자체가 네트워크로 복제 가능해짐

2) 복제할 속성 지정

UPROPERTY(Replicated)
int32 Health;

→ 속성을 Replicated로 표시해야 동기화 가능

3) GetLifetimeReplicatedProps() 오버라이드

void AMyActor::GetLifetimeReplicatedProps(TArray< FLifetimeProperty >& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    DOREPLIFETIME(AMyActor, Health);
}

→ 어떤 속성을 복제할지 등록해야 함 (DOREPLIFETIME 매크로 사용)

정리

구분RPCProperty Replication
방식함수 호출변수(데이터) 복제
흐름양방향 (Client→Server / Server→Client / Multicast)일방향 (Server→Client)
실행 시점호출 순간 즉시 실행서버 값이 바뀔 때 자동으로 클라에 반영
용도행동, 이벤트 트리거 (총 쏘기, 점프, 공격 등)상태 동기화 (체력, 위치, 아이템 개수 등)
설정법UFUNCTION(Server/Client/Reliable/Unreliable)UPROPERTY(Replicated) + DOREPLIFETIME
보안Server RPC는 _Validate()로 위변조 방지 가능데이터는 서버 권한만 반영 → 신뢰성 확보
  • RPC = “원격에서 함수 실행”
  • Property Replication = “서버 변수를 클라와 동기화”

2개의 댓글

comment-user-thumbnail
2025년 9월 15일

여울님의 글은 언제나 힘이 있네요
Replication과 RPC에 대한 간결한 흐름이 핵심을 관통했습니다.

1개의 답글