UE5 네트워킹 기초
서버-권한 아키텍처와 Replication 시스템
네트워킹 개요
서버-권한 모델의 이해
언리얼 엔진 5는 서버-권한(Server-Authoritative) 네트워킹 아키텍처를 사용합니다. 모든 중요한 게임 로직은 서버에서 실행되며, 클라이언트는 서버의 결과를 수신하고 표시합니다.
┌─────────────────────────────────────────────────────────────────┐ │ 서버-권한 아키텍처 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ [서버] ───────────────────────────────────────────────────── │ │ │ │ │ │ Actor 위치, 변수 값, 동작 정보 복제 │ │ │ │ │ ├──────────────────────▶ [클라이언트 1] │ │ │ │ │ ├──────────────────────▶ [클라이언트 2] │ │ │ │ │ └──────────────────────▶ [클라이언트 3] │ │ │ │ 핵심 원칙: │ │ • 서버가 게임 상태에 대한 절대적 권한을 가짐 │ │ • 클라이언트 데이터는 절대 신뢰하지 않음 │ │ • 서버가 모든 중요한 결정을 내림 │ │ │ └─────────────────────────────────────────────────────────────────┘
- State vs Event — 지속적인 게임 상태는 Replicated Property로, 일회성 이벤트는 RPC로 처리
- 클라이언트 불신 — 모든 클라이언트 입력은 서버에서 검증해야 함
- 대역폭 관리 — 필요한 데이터만 필요한 클라이언트에게 전송
서버 유형
Listen Server vs Dedicated Server
Listen Server
호스트 플레이어가 서버 역할을 겸함
- + 별도 서버 비용 없음
- + 소규모 Co-op에 적합
- - 호스트에게 레이턴시 이점
- - 호스트 종료 시 세션 종료
예: 원신, 다크소울 Co-op
Dedicated Server
렌더링 없는 전용 서버
- + 모든 플레이어 동등한 조건
- + 24/7 상시 운영 가능
- + 대규모 (100명+) 지원
- - 서버 비용 발생
예: Fortnite, 경쟁 게임
| 특성 | Listen Server | Dedicated Server |
|---|---|---|
| 비용 | 무료 (플레이어 호스팅) | 서버 비용 발생 |
| 공정성 | 호스트 유리 | 모두 동등 |
| 안정성 | 호스트 의존적 | 높음 |
| 플레이어 수 | 소규모 (2-16명) | 대규모 (100명+) |
Replication 시스템
UE5에서 제공하는 복제 시스템
Replication은 서버와 클라이언트 간에 데이터와 함수 호출을 동기화하는 프로세스입니다.
Generic Replication
기본 복제 시스템. 소규모 멀티플레이어에 적합합니다.
Replication Graph
Fortnite에서 검증된 대규모 복제 시스템. 100+ 플레이어, 50,000+ 액터 지원.
Iris Replication (실험적)
UE5의 새로운 복제 시스템. 기존 대비 31% 성능 향상. 차세대 대규모 게임용.
bReplicates = true로 설정된 Actor만 네트워크로 복제됩니다. Character는 기본적으로 복제가 활성화되어 있습니다.
Actor 복제 설정
기본 복제 활성화
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class MYGAME_API AMyActor : public AActor
{
GENERATED_BODY()
public:
AMyActor();
// 복제 설정
virtual void GetLifetimeReplicatedProps(
TArray<FLifetimeProperty>& OutLifetimeProps) const override;
protected:
// 복제되는 변수
UPROPERTY(Replicated)
int32 Score;
UPROPERTY(ReplicatedUsing = OnRep_Health)
float Health;
UFUNCTION()
void OnRep_Health();
};
#include "MyActor.h"
#include "Net/UnrealNetwork.h" // 필수!
AMyActor::AMyActor()
{
// 복제 활성화
bReplicates = true;
// 이동 복제 (선택적)
SetReplicateMovement(true);
// 기본값
Health = 100.f;
Score = 0;
}
void AMyActor::GetLifetimeReplicatedProps(
TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
// 기본 복제
DOREPLIFETIME(AMyActor, Score);
DOREPLIFETIME(AMyActor, Health);
}
void AMyActor::OnRep_Health()
{
// 클라이언트에서 Health가 변경될 때 호출
if (Health <= 0.f)
{
PlayDeathAnimation();
}
UpdateHealthBar();
}
Net/UnrealNetwork.h를 반드시 include해야 DOREPLIFETIME 매크로를 사용할 수 있습니다.
핵심 요약
- 서버-권한 모델 — 서버가 게임 상태에 대한 절대적 권한을 가지며, 클라이언트는 결과만 수신
- Listen vs Dedicated — Co-op은 Listen Server, 경쟁 게임은 Dedicated Server 권장
- bReplicates — Actor 복제의 기본 조건
- GetLifetimeReplicatedProps — 복제할 속성을 등록하는 필수 오버라이드
- ReplicatedUsing — 값 변경 시 클라이언트에서 콜백 호출
도전 과제
배운 내용을 직접 실습해보세요
UE5 에디터에서 Number of Players를 2-3으로 설정하고 PIE로 실행하세요. HasAuthority(), IsLocalController(), GetLocalRole()을 UE_LOG로 출력하여 서버/클라이언트 역할을 확인하세요.
GetNetMode()를 사용하여 NM_Standalone, NM_DedicatedServer, NM_ListenServer, NM_Client를 구분하는 유틸리티 함수를 작성하세요. 각 모드에서 RPG 로직이 어디서 실행되어야 하는지 정리하세요.
NetEmulation 콘솔 명령(PktLag, PktLoss, PktOrder)으로 네트워크 지연/패킷 로스를 시뮬레이션하세요. 다양한 네트워크 환경에서 RPG 전투의 체감 품질을 테스트하세요.