언리얼엔진5 공부

Property Replication

Client Side 2025. 11. 20. 08:38

개념

  • 서버에 있는 객체(액터)의 특정 변수(프로퍼티)를 클라이언트에 자동으로 동기화(복제)하는 시스템. 즉, 서버에서 변수 값이 변경되면, 그 변경된 값을 별도 코딩 없이도 자동으로 모든 클라이언트에 전송해 최신 상태를 유지시켜 준다.
  • 액터의 모든 속성의 변경된 값을 모든 클라이언트에게 복제하는 것은 비효율적입니다. 우리가 원하는 속성만을 다른 클라이언트에게 복제하는 것을 프로퍼티 레플리케이션이라고 한다.

필요성

  • 멀티플레이어 게임은 다중 클라이언트가 각각 다른 컴퓨터에서 플레이하기 때문에, 모든 클라이언트가 서버의 진짜 게임 상태와 일치하는 정보를 받아야 오류 없이 올바른 게임 진행이 가능하다.

사용법

  • 변수에 UPROPERTY() 매크로와 함께 복제 옵션 지정
  • UPROPERTY(Replicated) int32 Health;
  • 복제를 사용하는 클래스에서 GetLifetimeReplicatedProps 함수 override이 함수는 언리얼 엔진에 어떤 변수들을 복제해야 하는지를 알려주는 역할을 하며, DOREFLIFETIME 매크로로 등록한다.
  • void GetLifetimeReplicatedProps(TArray< FLifetimeProperty >& OutLifetimeProps) const override { Super::GetLifetimeReplicatedProps(OutLifetimeProps); DOREPLIFETIME(ACharacter, Health); }

세부 옵션과 확장 기능

  • 조건부 복제 (COND_ 조건자)*
    • 조건을 달아서 특정 상황, 특정 클라이언트에만 복제할 수 있다.
    UPROPERTY(ReplicatedUsing=OnRep_Health, Cond=COND_OwnerOnly)
    int32 Health;
    
    • COND_OwnerOnly : 변수 소유자 클라이언트에게만 복제
    • 특정 클라이언트에게만 보이고 다른 클라이언트에게는 보이지 않아야 할 때
  • 복제 알림 (ReplicatedUsing)
    • 변수 값이 클라이언트에 복제되어 변경되면 자동으로 호출되는 함수. UI 업데이트나 음향 재생 같은 클라이언트 측 후처리 작업에 활용.
  • UPROPERTY(ReplicatedUsing=OnRep_Health) int32 Health; UFUNCTION() void OnRep_Health();

동작 흐름

  • 서버에서 변수 변화
    • 서버는 직접 변수 값을 수정
  • 변경된 변수 복제 대상에 포함
    • 엔진이 GetLifetimeReplicatedProps 등록 된 변수 중 변경된 것을 감지
  • 네트워크를 통해 클라이언트 전송
    • 변수 변경 값이 클라이언트에게 전송
  • 클라이언트 변수 자동 갱신
    • 클라이언트는 해당 변수 값을 서버와 동일하게 업데이트 받는다.
  • 알림 함수 호출 (있다면)
    • ReplicatedUsing으로 지정한 알림 함수가 호출돼 클라이언트에서 후처리를 수행한다.

주의사항 및 팁

  • 복제 대상 변수는 서버에서만 값 변경을 권장한다.
  • 구조체(UStruct)의 복제도 지원하지만, 안에 담긴 각 변수 대상으로 복제 옵션을 개별 지정한다.
  • 큰 객체들은 RPC로 따로 주고받는게 나을 수 있고, 자주 바뀌는 변수들은 비신뢰성 네트워크 알림과 함께 사용하는 걸 권장한다.
  • 복제가 설정되지 않은 변수는 클라이언트에 절대 동기화되지 않으니, 변수 복제가 필요한지 잘 판단한다.

'언리얼엔진5 공부' 카테고리의 다른 글

델리게이트  (0) 2025.11.24
숫자야구_숫자 로직  (0) 2025.11.21
RPC(Remote Procedure Call)  (0) 2025.11.19
ENetMode  (0) 2025.11.18
디버깅  (0) 2025.11.17