본문 바로가기
Unreal 게임 개발/Unreal 강의 개인 정리

Actor & Property Replication, Replication Callback Function - Unreal Network MultiPlayer Framework

by daisy0461 2025. 3. 7.

Actor Replication (액터 리플리케이션)

특정 플레이어에 속한 정보를 네트워크 내 다른 플레이어에게 복제하는 작업이다. (동기화)

클라이언트 - 서버 모델에서는 대부분 서버에서 클라이언트로 전달한다.

 

리플리케이션의 방법

  1. 프로퍼티 리플리케이션 : Actor가 가진 속성 값을 복제한다.
  2. RPC(Remote Procedure Call) : 함수를 호출하는 역할을 한다. (예전엔 함수 리플리케이션으로 부름)

기본 Actor의 로딩

클라이언트가 초기화 될 때 모든 Actor의 정보를 서버로부터 받는 것은 데이터양이 너무 많아 비효율적이다.

따라서 기본 배경과 관련된 Actor는 맵을 통해 스스로 로딩하도록 설계되어있다.
이 말은 서버와 클라이언트가 가지고 있는 배경 파일에 유효성 검사만 진행하고 서버로부터 배경 데이터를 받는 것이 아니라 클라이언트가 스스로 로딩하도록 한다는 의미이다.

더보기

고정으로 제공하는 Actor : 배경 Actor / 동적으로 생성하는 Actor : PlayerController와 Pawn 
고정 Actor에 대해 NerLoadOnClient 속성을 체크해야 고정으로 제공한다. (체크가 되어있는 것이 기본값이다.)

 

프로퍼티 리플리케이션

Actor의 속성값이 변경되었을 경우에 네트워크를 통해 클라이언트에게 변경 내용을 전송해줘야한다.

이때 네트워크 데이터양을 최소화하기 위해 Actor 전체를 다시 보내기 보다는 변경된 속성값만 정리해서 보내면 된다.

이러한 속성값을 전달하기 위해서 Actor의 Replicates라는 옵션을 체크해야한다.

 

프로퍼티 리플리케이션 지정

  1. Actor의 리플리케이션 속성을 true로 지정 - bReplicates 속성을 true로 설정
  2. 네트워크로 복제할 Actor의 속성을 키워드로 지정 - UPROPERTY에 Replicated 키워드 설정
    bReplicates가 false면 Replicated를 설정해도 네트워크를 통해 전달되지 않는다.
    접근 제한자는 관계가 없다.
  3. GetLifetimeReplicatedProps함수로 네트워크로 복제할 속성 추가
    #include "Net/UnrealNetwork.h" 헤더 파일 포함 후 DOREPLIFETIME 매크로를 사용해 복제할 속성 명시

    여기서 Lifetime이란 Actor의 네트워크 채널(Actor Channel)의 Lifetime을 의미한다.
    간단하게 Actor Channel이 열려있는 기간을 의미힌다.
    GetLifetimeReplicatedProps함수로 속성을 추가하면 해당 속성은 네트워크 채널이 열려있을 때 리플리케이션되며
    네트워크 채널이 닫히면 리플리케이션이 중단된다.
    다음과 같이 DOREPLIFETIME에 (클래스, 속성)을 넣어주면 해당 클래스의 속성은 리플리케이션된다.

위와 같이 설정을 한 뒤 Tick을 다음과 같이 설정을 해주면 매 Tick마다 해당 Actor가 회전을 한다.
클라이언트에 반영하는 부분을 주석처리하면 서버에서는 Actor가 돌아가지만 클라이언트에선 돌아가지 않는다.

 

 

리플리케이션 콜백 함수 호출

위의 예시에서는 매 Tick마다 받은 속성을 업데이트했다.
이렇게 되면 Tick의 코드가 방대해지고 전송해야할 데이터의 양이 늘어난다.

또한 네트워크 전송주기가 Tick보다 느리면 비효율적으로 동작할 수도 있다.
위와 같은 상황을 방지하기 위해 해당 속성의 콜백 함수를 등록해서 Tick을 대신해서 호출하도록 한다.

리플리케이션 콜백 함수 준비 단계

리플리케이션 콜백 함수를 사용하면 필요한 타이밍에만 로직을 처리하여 효율적인 구현이 가능하다.
이는 클라이언트 속성이 복제될 때 콜백함수가 호출되도록 해야한다.

  1. UPROPERTY의 Replicated 키워드를 ReplicatedUsing으로 변경
  2. ReplicatedUsing에 호출할 콜백함수를 지정. 호출될 콜백 함수는 UFUNCTION으로 선언해야한다.
  3. 콜백 함수 구현
    일반적으로 OnRep_의 접두사를 가지는 이름 규칙을 가진다.
    콜백 함수는 서버가 아닌 클라이언트에서만 호출된다.

헤더 파일에 다음과 같이 변경 및 수정을 한다.
이렇게 제작하면 서버에서 ServerRotationYaw가 변경이 되고 클라이언트에 값이 전달될 때
클라이언트에서 OnRep_ServerRotationYaw()가 자동으로 호출된다. 

하지만 OnRep_ServerRotationYaw()는 서버에선 자동으로 호출되지 않는다.
서버에서 해당 함수를 사용하기 위해서 명시적으로 작성를 해야 해당 함수 로직을 실행한다.