개념
- 서버에 있는 객체(액터)의 특정 변수(프로퍼티)를 클라이언트에 자동으로 동기화(복제)하는 시스템. 즉, 서버에서 변수 값이 변경되면, 그 변경된 값을 별도 코딩 없이도 자동으로 모든 클라이언트에 전송해 최신 상태를 유지시켜 준다.
- 액터의 모든 속성의 변경된 값을 모든 클라이언트에게 복제하는 것은 비효율적입니다. 우리가 원하는 속성만을 다른 클라이언트에게 복제하는 것을 프로퍼티 레플리케이션이라고 한다.
필요성
- 멀티플레이어 게임은 다중 클라이언트가 각각 다른 컴퓨터에서 플레이하기 때문에, 모든 클라이언트가 서버의 진짜 게임 상태와 일치하는 정보를 받아야 오류 없이 올바른 게임 진행이 가능하다.
사용법
- 변수에 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 |