개요
지난 시간에 배운 프로퍼티 레플리케이션의 기초를 바탕으로, 오늘은 멀티플레이 환경에서 네트워크 부하를 줄이고 효율적으로 이벤트를 처리하는 Replication Notify (RepNotify) 기능과 레벨 배치 액터의 동기화 속성인 NetLoadOnClient에 대해 학습했다.
1. NetLoadOnClient 속성이란?
멀티플레이 게임에서 월드에 존재하는 액터들은 스폰 방식에 따라 네트워크 처리 방식이 달라야 한다.
- 개념: 레벨 디자인 단계에서 레벨에 고정적으로 배치해 두는 액터(예: 맵의 기믹 요소, 부서지는 상자 등)에 사용하는 속성이다.
- 동작 방식: 이 속성을
true로 지정하면, 서버가 일일이 스폰 정보를 내려주지 않아도 모든 클라이언트가 맵을 로드할 때 스스로 해당 액터를 스폰하여 동기화한다. - 주의점: 플레이어가 게임에 접속(로그인)할 때 동적으로 스폰되는
PlayerController나Pawn등과는 스폰 방식이 다르므로 혼동하지 않아야 한다.
2. Replication Notify (RepNotify / OnRep)의 필요성
액터의 회전값(ServerRotationYaw)이 서버에서 클라이언트로 레플리케이션 될 때, 클라이언트가 이 값을 화면에 반영하는 방법을 생각해 보자.
- 비효율적인 방법: 클라이언트의
Tick()함수에서 매 프레임마다 복제된 변수 값을 확인하여 액터를 회전시킨다. 이는 값의 변경이 없어도 매번 불필요한 연산을 수행하므로 매우 비효율적이다. - 해결책 (RepNotify): 속성 값이 변경되어 클라이언트에 복제(도착)되는 바로 그 시점에 특정 콜백 함수를 자동으로 실행시킬 수 있는데, 이를 Replication Notify라고 한다.
3. C++에서 RepNotify 사용 및 구현 방법
C++에서 이 기능을 사용하려면 특정 규칙을 지켜서 코드를 작성해야 한다.
- 키워드 지정:
UPROPERTY()매크로 안에ReplicatedUsing = 함수이름형태로 바인딩할 함수를 지정한다. - 함수 명명 규칙: 콜백 함수는 반드시
OnRep_이라는 접두사가 붙어야 한다. - UFUNCTION 매크로: 해당 콜백 함수 위에는 반드시
UFUNCTION()매크로가 붙어있어야 엔진이 정상적으로 인식한다.
구현 예시 (C++)
// DXBox.h
protected:
// 값이 복제되어 들어오면 OnRep_ServerRotationYaw 함수를 자동 실행하라!
UPROPERTY(ReplicatedUsing = OnRep_ServerRotationYaw)
float ServerRotationYaw;
private:
UFUNCTION()
void OnRep_ServerRotationYaw();
// DXBox.cpp
// 클라이언트에서만 자동으로 호출되는 콜백 함수
void ADXBox::OnRep_ServerRotationYaw()
{
// 복제된 값을 바탕으로 클라이언트 화면의 박스를 실제로 회전시킨다.
SetActorRotation(FRotator(0.f, ServerRotationYaw, 0.f));
// 이 방식을 사용하면 Tick에서 매 프레임 검사할 필요가 없어 성능에 매우 유리하다.
}
4. RepNotify의 중요한 특징 (C++ vs Blueprint)
C++로 작성한 OnRep 함수는 서버에서는 실행되지 않고 오직 클라이언트에서만 실행된다는 아주 중요한 특징이 있다. 만약 서버 컴퓨터의 화면(혹은 로직)에서도 동일한 처리가 필요하다면, 서버 로직 안에서 해당 OnRep 함수를 명시적으로 직접 호출해 주어야 한다.
흥미롭게도, C++의 OnRep과 블루프린트의 RepNotify는 작동 방식에 미세한 차이가 있다.

'프로그래밍 > Unreal Engine 5' 카테고리의 다른 글
| [Unreal Engine5] 멀티플레이 최적화 Relevancy, NetPriority, NetDormancy의 이해 (0) | 2026.03.25 |
|---|---|
| [UnrealEngine 5] 멀티플레이 최적화 : NetUpdateFrequency와 클라이언트 보간 (0) | 2026.03.24 |
| [Unreal Engine 5] Property Replication (0) | 2026.03.20 |
| [Unreal Engine 5] Remote Procedure Call 기초 (0) | 2026.03.18 |
| [Unreal Engine 5] NetRole (Authority와 Proxy) (0) | 2026.03.17 |