액터 리플리케이션 기초
액터 리플리케이션
특정 플레이어에 속한 액터의 정보를 네트워크 내 다른 플레이어에게 복제하는 작업
클라이언트-서버 모델에서는 대부분 서버에서 클라이언트로 전달
- 리플리케이션의 방법
프로퍼티 리플리케이션
RPC(Remote Procedure Call)
기본 액터의 로딩
클라이언트가 초기화 될 때 모든 액터 정보를 서버로부터 받는 것은 비효율적
따라서 기본 배경에 관련된 액터는 맵을 통해 스스로 로딩하도록 설계되어 있음
- 고정으로 제공하는 액터
레벨을 구성하는 배경 액터
- 동적으로 생성하는 액터
플레이어 컨트롤러, 폰
고정 액터에 대해 NetLoadOnClient 속성을 체크해야 함 (기본값)
서버와 통신 없이 클라이언트가 초기화 될 때 자체적으로 로딩하여 서버에서 콘텐츠를 배포한 것과 동일한 효과를 얻어낼 수 있음
프로퍼티 리플리케이션의 구현
액터의 리플리케이션
고정으로 보여지는 액터 중, 게임 중 변경 사항이 발생하는 액터는 그 값을 전달해야 함
네트워크 데이터를 최소화하기 위해 변경 사항을 보내기보다, 변경을 유발한 속성 값을 전달
이를 위해 액터의 Replicates 옵션을 체크해야 함

리플리케이션 프로퍼티(속성)의 지정
- 액터의 리플리케이션 속성을 참으로 지정
bReplicates 속성을 true로 설정
- 네트워크로 복제할 액터의 속성을 키워드로 지정
UPROPERTY에 Replicated 키워드 설정
- GetLifetimeReplicatedProps() 함수 오버라이드하여 네트워크로 복제할 속성을 추가
#include "Net/UnrealNetwork.h" 헤더 파일 지정
DOREPLIFETIME 매크로를 사용해 복제할 속성을 명시
Lifetime은 액터 채널의 Lifetime을 의미함
즉, 활성화된 액터 채널로 전송할 복제될 속성을 의미함
리플리케이션 콜백 함수 호출
- 클라이언트에 속성이 복제될 때 콜백 함수가 호출되도록 구현
UPROPERTY의 Replicated 키워드를 ReplicatedUsing 키워드로 변경
ReplicatedUsing에 호출할 콜백 함수를 지정
호출될 콜백 함수는 UFUNCTION으로 선언해야 함
- 콜백 함수의 구현
일반적으로 OnRep_ 접두사를 가지는 이름 규칙을 가짐
콜백 함수는 서버가 아닌 클라이언트에서만 호출됨
- OnActorChannelOpen()
액터 채널이 열리면 호출
물론 PostNetInit() 이후에 호출되고, Replicate가 되기 전 호출됨
C++ OnRep vs 블루프린트 RepNotify
- C++ ReplicatedUsing
클라이언트에서만 호출됨
함수를 명시적 호출 가능
값이 변경된 때만 호출됨
- Blueprint RepNotify
서버/클라이언트에서 호출됨
명시적 호출 불가능
서버는 항시 호출됨, 클라이언트는 값이 변경된 때만 호출됨
실습코드
https://github.com/dnjfs/ArenaBattle_Network/commit/440d1b5a4934b97bb0553abee066a2e5fda66032
- GetLifetimeReplicatedProps() 오버라이딩
프로퍼티 리플리케이션을 위하여 DOREPLIFETIME 매크로로 프로퍼티 추가