UE5 네트워크 리플리케이션
Unreal Engine의 네트워크 모델은 서버 권위(Server Authoritative) 구조입니다. 서버가 게임 상태를 결정하고 클라이언트에 변경 사항을 전파(Replicate)합니다.
서버-클라이언트 구조
Section titled “서버-클라이언트 구조”Server (Authority) ├─ 게임 로직 실행 ├─ 상태 변경 → 클라이언트로 리플리케이션 └─ RPC 검증 및 처리
Client ├─ 입력 전송 (Server RPC) ├─ 리플리케이션 수신 └─ 예측(Prediction) 및 보정Actor 리플리케이션 활성화
Section titled “Actor 리플리케이션 활성화”AMyActor::AMyActor(){ // Actor 자체를 네트워크상에서 복제 bReplicates = true;
// 이동(Transform)도 리플리케이션 SetReplicatingMovement(true);}변수 리플리케이션
Section titled “변수 리플리케이션”UPROPERTY(Replicated) 또는 UPROPERTY(ReplicatedUsing=OnRep_함수명) 으로 선언합니다.
UCLASS()class AMyCharacter : public ACharacter{ GENERATED_BODY()
public: // 단순 리플리케이션 (값만 동기화) UPROPERTY(Replicated) int32 Health;
// 변경 시 콜백 호출 (ReplicatedUsing) UPROPERTY(ReplicatedUsing=OnRep_Ammo) int32 Ammo;
UFUNCTION() void OnRep_Ammo(int32 OldAmmo);
// GetLifetimeReplicatedProps에 등록 필수 virtual void GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps) const override;};void AMyCharacter::GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps) const{ Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(AMyCharacter, Health);
// 조건부 리플리케이션 — 자신의 클라이언트에만 전송 DOREPLIFETIME_CONDITION(AMyCharacter, Ammo, COND_OwnerOnly);}
void AMyCharacter::OnRep_Ammo(int32 OldAmmo){ // 클라이언트에서만 실행 — UI 업데이트 등 UpdateAmmoUI(Ammo);}리플리케이션 조건
Section titled “리플리케이션 조건”| 조건 | 설명 |
|---|---|
COND_None | 모든 클라이언트 |
COND_OwnerOnly | 소유 클라이언트만 |
COND_SkipOwner | 소유 클라이언트 제외 |
COND_InitialOnly | 첫 리플리케이션만 |
COND_SimulatedOnly | 시뮬레이션 프록시만 |
RPC (Remote Procedure Call)
Section titled “RPC (Remote Procedure Call)”| 타입 | 선언 | 실행 위치 | 호출 위치 |
|---|---|---|---|
| Server | UFUNCTION(Server, Reliable) | 서버 | 클라이언트 |
| Client | UFUNCTION(Client, Reliable) | 소유 클라이언트 | 서버 |
| NetMulticast | UFUNCTION(NetMulticast, Unreliable) | 서버+모든 클라이언트 | 서버 |
// 헤더UFUNCTION(Server, Reliable, WithValidation)void ServerFire(FVector Origin, FVector Direction);
UFUNCTION(NetMulticast, Unreliable)void MulticastPlayFireEffect();
// .cpp — 구현 시 _Implementation, _Validate 접미사void AMyCharacter::ServerFire_Implementation(FVector Origin, FVector Direction){ // 서버에서만 실행 — 데미지 처리 등 SpawnProjectile(Origin, Direction); MulticastPlayFireEffect(); // 모든 클라이언트에 이펙트 전송}
bool AMyCharacter::ServerFire_Validate(FVector Origin, FVector Direction){ // 치팅 검증 — false 반환 시 연결 끊김 return Direction.IsNormalized();}
void AMyCharacter::MulticastPlayFireEffect_Implementation(){ // 서버+모든 클라이언트 실행 — 사운드·파티클 PlayFireSound(); SpawnMuzzleFlash();}네트워크 역할 확인
Section titled “네트워크 역할 확인”void AMyActor::Tick(float DeltaTime){ switch (GetLocalRole()) { case ROLE_Authority: // 서버 — 게임 로직 break; case ROLE_AutonomousProxy: // 소유 클라이언트 — 입력 처리, 예측 break; case ROLE_SimulatedProxy: // 비소유 클라이언트 — 보간·시각적 표현 break; }}
// 서버 여부만 빠르게 확인if (HasAuthority()) { /* 서버 전용 코드 */ }컴포넌트 리플리케이션
Section titled “컴포넌트 리플리케이션”AMyActor::AMyActor(){ MyComponent = CreateDefaultSubobject<UMyComponent>(TEXT("MyComp")); MyComponent->SetIsReplicated(true); // 컴포넌트 리플리케이션 활성화}실무 주의사항
Section titled “실무 주의사항”- Reliable RPC 남용 금지 — 보장 전송이라 패킷 손실 시 재전송 → 지연 증가. 파티클·사운드 이펙트는
Unreliable사용 - OnRep 함수는 클라이언트에서만 호출 — 서버에서는 호출되지 않으므로 서버 로직을 OnRep에 넣지 말 것
- RPC는 리플리케이트된 Actor에서만 동작 —
bReplicates = false이면 RPC 전송 안 됨