티스토리 뷰

🟩 학습 목표

  • Property Replication의 가장 핵심적인 작동 원리를 이해한다.
  • RPC와 Property Replication 지식을 결합하여 채팅 야구 게임의 로직을 구현한다.

🟧 레플리케이션(Replication)의 기초

레플리케이션은 서버에 생성된 액터의 정보를 네트워크 내의 다른 클라이언트들에게 복제하는 모든 과정을 의미한다. 언리얼 엔진의 서버-클라이언트 모델에서 레플리케이션은 기본적으로 서버에서 클라이언트로 흐르는 단방향성을 가진다.

🟦 복제의 두 가지 방법

  1. RPC(Remote Procedure Call): 함수 호출 자체를 복제하여 실행한다.
  2. Property Replication: 액터가 가진 특정 변수(속성)의 값이 변경되었을 때 이를 복제한다.

🟧 Property Replication의 이해

액터가 가진 수많은 속성을 매번 모두 복제하는 것은 네트워크 대역폭 낭비이므로 매우 비효율적이다. 따라서 개발자가 원하는 특정 속성만을 선택하여 복제하는 것이 프로퍼티 레플리케이션의 핵심이다.

철칙: 프로퍼티 레플리케이션은 항상 Authority(서버)에서 Proxy(클라이언트) 방향으로만 이루어진다.


🟧 프로퍼티 레플리케이션 설정 단계

네트워크 복제를 활성화하기 위해서는 다음의 세 가지 단계를 정확히 준수해야 한다.

단계 작업 내용 비고
1단계 액터 생성자에서 bReplicates = true; 설정 액터 자체의 복제 기능 활성화
2단계 헤더 파일의 변수 선언 시 Replicated 키워드 추가 UPROPERTY(Replicated) 형식
3단계 GetLifetimeReplicatedProps 함수 구현 복제될 속성을 매크로로 명시

🟦 코드 구현 예시

복제 로직을 구현할 때는 Net/UnrealNetwork.h 헤더 파일이 반드시 포함되어야 한다.

// .cpp 파일 예시
#include "Net/UnrealNetwork.h"

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

    // DOREPLIFETIME 매크로를 사용하여 복제할 변수 지정
    DOREPLIFETIME(AMyActor, MyHealth);
}

🟧 복제 가능 여부 판별

프로퍼티 레플리케이션이 정상적으로 작동하기 위해서는 서버와 클라이언트 모두에 해당 액터가 존재해야 하며, 복제 설정이 올바르게 되어 있어야 한다.

  • 상황 1: 서버에 액터가 없는 경우
    • 프로퍼티 레플리케이션은 서버로부터 클라이언트로의 단방향성을 가지므로, 서버에 원본 액터가 존재하지 않는다면 복제 자체가 불가능하다.
  • 상황 2: bReplicates가 false인 경우
    • 서버에 액터가 있더라도 클라이언트 쪽에 액터가 복제되어 생성되지 않으므로, 속성 값을 전달할 대상이 없어 레플리케이션이 일어나지 않는다.
  • 상황 3: 서버와 클라이언트 모두에 액터가 존재하는 경우
    • 두 곳 모두에 액터가 존재하고 복제 설정이 활성화되어 있다면 정상적으로 프로퍼티 레플리케이션이 수행된다.

🟧 핵심 요약

  • 레플리케이션은 서버의 데이터를 클라이언트로 복제하는 과정이며 단방향성을 띤다.
  • 효율적인 네트워크 관리를 위해 특정 변수만 골라 복제하는 것이 프로퍼티 레플리케이션이다.
  • 구현을 위해서는 bReplicates 설정, UPROPERTY 키워드 지정, GetLifetimeReplicatedProps 함수 오버라이딩이 필수적이다.
  • 클라이언트(Proxy)는 서버(Authority)로부터만 값을 전달받을 수 있다는 점을 유념해야 한다.