관심 관리
개요
관심 관리는 서버에서부터 특정 클라이언트/플레이어로 특정한 네트워크 요소 업데이트를 제한하는 데이터 선별 기능 집합입니다. 이러한 선별 작업은 네트워크 트래픽을 줄이고 데이터(팀 전용 정보 등)에 대한 플레이어 접근을 제한하는 데 유용합니다.
여기에는 2개의 데이터 선별 메커니즘이 있습니다:
- 관심 객체:
NetworkObject
업데이트를 서버에서 특정PlayerRef
로 제한합니다. - 관심 그룹: 서버의 특정 네트워크 속성 업데이트를
PlayerRef
마다/NetworkObject
기반마다 제한합니다.
관심 객체
관심 객체는 서버로부터 어떤 NetworkObject
업데이트(네트워크 속성 및 RPC)를 받을 플레이어를 결정합니다.
NetworkObject.ObjectInterest
설정은 해당 객체에 대한 플레이어 관심사를 결정하는 방법을 제어합니다. 세 가지 모드 옵션이 있습니다:
- 관심 지역: 3D 공간에서 이 객체의
AoiPositionSource
와 겹치는 AOI 영역을 가진 플레이어만 이 객체에 관심을 가질 수 있습니다. - 모든 플레이어: 모든 플레이어가 객체의 업데이트를 받습니다.
- 플레이어 명시: 명시적으로 기록된 플레이어만 이 객체에 관심을 갖습니다.
관심 지역
서버는 각 플레이어의 관심 영역(AOI) 지역을 사용하여 이 NetworkObject
가 해당 플레이어의 관심 대상인지 확인합니다. 플레이어 AOI 영역은 Runner.AddPlayerAreaOfInterest()
를 호출하여 지정합니다
이러한 영역은 하나의 틱에만 존재하며 모든 틱을 다시 적용해야 합니다. 플레이어는 여러 지역을 가질 수 있습니다(예: 플레이어가 원격 카메라를 조작하는 경우). 이 객체 위치가 플레이어의 AOI 영역 중 하나 이상에 있으면 해당 플레이어가 관심을 갖고 이 NetworkObject
에 대한 서버 업데이트를 받게 됩니다.
AoiPositionSource
는 이 NetworkObject
의 위치를 결정하는 데 사용할 NetworkAreaOfInterestBehaviour
컴포넌트를 나타냅니다. null
이면 이 개체에서 검색됩니다. NetworkTransform
및 NetworkRigidbody
는 NetworkAreaOfInterestBehaviour
에서 파생되었으며 일반적으로 AoiPositionSource
에 사용됩니다.
C#
public class SetAreaOfInterest : NetworkBehaviour {
public float Radius = 32f;
public override void FixedUpdateNetwork() {
if (Runner.IsServer){
var controller = Object.InputAuthority;
// Set the controlling players area of interest region around this object
if (controller) {
Runner.AddPlayerAreaOfInterest(controller, transform.position, Radius);
}
}
}
}
모든 플레이어
NetworkObject
는 모든 플레이어가 항상 관심을 갖습니다. 이렇게 하면 이 NetworkObject
에 대한 객체 선택이 비활성화되고 모든 플레이어는 이 NetworkObject
에 대한 서버 업데이트를 받게 됩니다.
플레이어 명시적 지정
Runner.SetPlayerAlwaysInterested()
에 특별히 플레이어 관심이 추가되지 않는 한 이 NetworkObject
는 플레이어에게 관심이 되지 않습니다. 관심 있는 플레이어만 이 NetworkObject
에 대한 서버 업데이트를 받을 수 있습니다.
C#
public class MakeAlwaysInterested : NetworkBehaviour, INetworkRunnerCallbacks {
// Wire up INetworkRunnerCallbacks for OnPlayerJoined
public override void Spawned() {
Runner.AddCallbacks(this);
}
public void OnPlayerJoined(NetworkRunner runner, PlayerRef player) {
if (runner.IsServer) {
SetPlayerAlwaysInterested(player, true);
}
}
}
RPC 및 관심 객체
또한 괌심 객체는 NetworkObject
의 인스턴스에 바인딩 되므로 정적이지 않은 RPC의 전송에도 영향을 미칩니다. 서버에서 RpcInvokeInfo
리턴 값을 사용하여 RPC가 연결된 NetworkObject
에 관심이 없는 플레이어에게 전송하지 못하도록 탐지하고 처리할 수 있습니다.
C#
[Rpc]
public RpcInvokeInfo RpcFoo() {
return default;
}
public override void FixedUpdateNetwork() {
if (Object.HasStateAuthority) {
var info = RpcFoo();
int culledCount = info.SendResult.CulledReceivers.Length;
if (culledCount > 0) {
//Handling for a target peer being culled from send
Debug.LogWarning($"{culledCount} receivers culled, possibly due to no Object Interest.");
}
}
}
관심 그룹
관심 그룹을 사용하여 네트워크 속성 업데이트를 특정 플레이어로만 제한할 수 있습니다.
네트워크 속성은 이름이 지정된 관심 그룹에 할당할 수 있으며 서버는 이 NetworkObject
에 대해 해당 이름이 지정된 관심 그룹에 관심이 있는 플레이어에게만 해당 속성에 대한 업데이트를 보냅니다(플레이어 관심 그룹 할당은 NetworkObject
별로 수행되며 전역이 아닙니다).
참고: 관심 객체로 인해 NetworkObject
가 업데이트를 수신하지 않으면 관심 그룹에 관계없이 구성원 데이터도 업데이트되지 않습니다.
그룹에 관심 플레이어 추가 및 제거
관심 그룹이 할당된 네트워크 속성은 기본적으로 플레이어에게 복제되지 않습니다. NetworkObject
관심 그룹에 관심 플레이어를 할당하는 방법은 두 가지입니다.
- 명시적으로 관심 플레이어 설정: 이
NetworkObject
에 대한 특정 그룹에PlayerRef
의 관심을 추가/제거합니다. - 기본 관심 그룹: 이
NetworkObject
의 특정 그룹에 관심 있는 모든 플레이어를 자동으로 설정합니다.
명시적으로 관심 플레이어 설정
그룹의 관심 플레이어는 NetworkObject
기준으로 Object.SetInterestGroup()
또는 Runner.SetInterestGroup()
메소드를 사용하여 설정합니다.
C#
public class SemiSecretColor : NetworkBehaviour, INetworkRunnerCallbacks {
// This Networked Property is assigned to the group 'EvenOnly'
[Networked(group: "EvenOnly")]
Color SecretColor { get; set; }
// Wire up INetworkRunnerCallbacks
public override void Spawned() {
Runner.AddCallbacks(this);
}
// this callback requires this NetworkBehaviour to implement INetworkRunnerCallbacks
public void OnPlayerJoined(NetworkRunner runner, PlayerRef player) {
if (runner.IsServer) {
// Only even numbered Players will be included in the group.
Object.SetInterestGroup(player, "EvenOnly", player.PlayerId % 2 == 0);
// or
Runner.SetInterestGroup(Object, player, "EvenOnly", player.PlayerId % 2 == 0);
}
}
}
기본 관심 그룹
모든 플레이어는 이 NetworkObject
에 대한 그룹에 대해 명시적으로 관심을 갖고 시작합니다. 이 목록에 없는 그룹의 경우 Object.SetInterestGroup()
또는 Runner.SetInterestGroup()
메소드(위의 예에서 보듯이)를 사용하여 이 NetworkObject
에 대한 그룹 관심사를 플레이어에게 명시적으로 할당해야 합니다.