Replication Condition으로 전송 대상 제한하기
20강. Replication Condition으로 전송 대상 제한하기
1. 이번 강의에서 해결할 문제
모든 Property를 모든 클라이언트에 보내면 탄약·개인 UI 상태처럼 다른 플레이어에게 필요 없는 정보가 노출되고 대역폭도 낭비됩니다. 반대로 체력을 OwnerOnly로 제한하면 상대의 머리 위 체력바나 피격 표현에 필요한 데이터가 사라집니다. 데이터 소비자를 먼저 정해야 합니다.
2. 학습 목표
3. 핵심 개념
Replication Condition은 Property를 등록한 뒤 어떤 연결에 보낼지 추가로 제한합니다. OwnerOnly는 Actor의 Owning Connection, SkipOwner는 그 연결을 제외한 관련 클라이언트, InitialOnly는 Actor가 처음 복제될 때만 보냅니다. 조건은 전송 최적화·가시성 도구이지 클라이언트 메모리를 비밀 저장소로 만드는 완전한 보안 체계가 아닙니다.
4. 단계별 실습
UPROPERTY(ReplicatedUsing = OnRep_Ammo)
int32 CurrentAmmo = 12;
UPROPERTY(Replicated)
FName WeaponDefinitionId;
UPROPERTY(ReplicatedUsing = OnRep_RemoteAimYaw)
uint8 CompressedAimYaw = 0;
virtual void GetLifetimeReplicatedProps(
TArray<FLifetimeProperty>& OutLifetimeProps) const override;
#include "Net/UnrealNetwork.h"
void ACaptureWeapon::GetLifetimeReplicatedProps(
TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME_CONDITION(
ACaptureWeapon, CurrentAmmo, COND_OwnerOnly);
DOREPLIFETIME_CONDITION(
ACaptureWeapon, WeaponDefinitionId, COND_InitialOnly);
DOREPLIFETIME_CONDITION(
ACaptureWeapon, CompressedAimYaw, COND_SkipOwner);
}
소유 클라이언트는 자신의 카메라·입력으로 Aim을 이미 알고 있어 SkipOwner로 원격 표현 데이터만 다른 연결에 보낼 수 있습니다. 탄약은 소유 HUD에 필요하므로 OwnerOnly입니다. 무기 정의가 런타임에 바뀔 가능성이 있으면 InitialOnly를 사용하면 안 됩니다.
PIE에서 두 클라이언트의 OnRep 로그를 나눠 CurrentAmmo는 소유자만, RemoteAim은 비소유자만 받는지 확인합니다. 서버는 원본을 보유하며 서버 코드에서 OnRep가 자동 호출될 것으로 기대하지 않습니다.
5. 코드가 동작하는 이유
NetDriver는 Actor의 Owning Connection과 현재 관련 연결을 기준으로 각 Property 조건을 평가합니다. 조건이 있어도 값은 서버에서만 변경하고, 클라이언트가 보낸 발사 요청은 서버 탄약으로 검증합니다. 탄약을 다른 클라이언트에 안 보낸다는 사실과 서버 탄약 권한은 서로 다른 방어층입니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
Replication Condition으로 전송 대상 제한하기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.