
'연관성(Relevancy)'이란 무엇이며, 왜 필요할까요?
맵이나 레벨이 충분히 커서 플레이어가 서로에게 '중요하지 않은' 존재가 될 수 있는 게임을 상상해보세요.
플레이어 'A'가 플레이어 'B'와 수 마일 떨어져 있다면, 굳이 'B'의 네트워크 업데이트를 받아야 할 필요가 있을까요?
대역폭을 절약하기 위해 언리얼 엔진의 네트워크 코드는 서버가 각 클라이언트에게 해당 클라이언트의 관련 집합에 속한 액터만 알려주도록 설계되어 있습니다.
언리얼 엔진은 플레이어에게 관련된 액터 집합을 결정하기 위해 다음과 같은 규칙을(순서대로) 적용합니다. 이러한 테스트는 가상 함수 'AActor::IsNetRelevantFor()'에 구현되어 있습니다.
💡info
Pawn과 PlayerController는 'AActor::IsNetRelevantFor()'를 오버라이드하며, 그 결과 연관성에 대한 조건이 다릅니다.
언리얼 엔진은 모든 액터에 우선순위를 부여하고, 게임플레이에서의 중요도에 따라 각 액터가 공평하게 대역폭을 할당받도록 하는 로드 밸런싱 기법을 사용합니다.
액터에는 “NetPriority”라는 float 변수가 있습니다. 이 값이 높을수록 해당 액터는 다른 액터에 비해 더 많은 대역폭을 할당받습니다.
예를 들어, “NetPriority”가 2.0인 액터는 1.0인 액터보다 정확히 두 배 더 자주 업데이트됩니다.
우선순위에서 중요한 것은 값 자체가 아니라 비율입니다. 따라서 모든 액터의 우선순위를 올린다고 해서 네트워크 성능이 향상되지는 않습니다.
액터의 현재 우선순위는 가상 함수 'AActor::GetNetPriority()'를 통해 계산됩니다.
기아 현상을 방지하기 위해 'AActor::GetNetPriority()'는 'NetPriority'에 액터가 마지막으로 복제된 이후 경과 시간을 곱합니다.
또한 'GetNetPriority' 함수는 액터와 뷰어(Viewer) 간의 상대 위치와 거리를 함께 고려합니다.

이러한 설정 대부분은 블루프린트의 클래스 기본값(Class Defaults)에서 찾을 수 있으며, 각 액터 자식의 C++ 클래스 내에서도 설정할 수 있습니다.
bOnlyRelevantToOwner = false;
bAlwaysRelevant = false;
bReplicateMovement = true;
bNetLoadOnClient = true;
bNetUseOwnerRelevancy = false;
bReplicates = true;
NetUpdateFrequency = 100.f;
NetCullDistanceSquared = 225000000.f;
NetPriority = 1.f;