수정중인 페이지 입니다.

관심 관리

개요

관심 관리는 서버에서부터 특정 클라이언트/플레이어로 특정한 네트워크 요소 업데이트를 제한하는 데이터 선별 기능 집합입니다. 이러한 선별 작업은 네트워크 트래픽을 줄이고 데이터(팀 전용 정보 등)에 대한 플레이어 접근을 제한하는 데 유용합니다.

여기에는 2개의 데이터 선별 메커니즘이 있습니다:

  • 관심 객체: NetworkObject 업데이트를 서버에서 특정 PlayerRef로 제한합니다.
  • 관심 그룹: 서버의 특정 네트워크 속성 업데이트를 PlayerRef마다/ NetworkObject 기반마다 제한합니다.
관심 관리는 최종적 일관성 복제 모드에 대해서만 사용할 수 있습니다.

EventualConsistency and ObjectInterest enabled in NetworkProjectConfig
최종적 일관성관심 객체Network 프로젝트 환경 구성에서 사용으로 설정할 수 있습니다.

메인 화면으로

관심 객체

관심 객체는 서버로부터 어떤 NetworkObject 업데이트(네트워크 속성 및 RPC)를 받을 플레이어를 결정합니다.

NetworkObject.ObjectInterest 설정은 해당 객체에 대한 플레이어 관심사를 결정하는 방법을 제어합니다. 세 가지 모드 옵션이 있습니다:

NetworkObject ObjectInterest Options
관심 객체 옵션

  • 관심 지역: 3D 공간에서 이 객체의 AoiPositionSource와 겹치는 AOI 영역을 가진 플레이어만 이 객체에 관심을 가질 수 있습니다.
  • 모든 플레이어: 모든 플레이어가 객체의 업데이트를 받습니다.
  • 플레이어 명시: 명시적으로 기록된 플레이어만 이 객체에 관심을 갖습니다.

메인 화면으로

관심 지역

서버는 각 플레이어의 관심 영역(AOI) 지역을 사용하여 이 NetworkObject가 해당 플레이어의 관심 대상인지 확인합니다. 플레이어 AOI 영역은 Runner.AddPlayerAreaOfInterest()를 호출하여 지정합니다

이러한 영역은 하나의 틱에만 존재하며 모든 틱을 다시 적용해야 합니다. 플레이어는 여러 지역을 가질 수 있습니다(예: 플레이어가 원격 카메라를 조작하는 경우). 이 객체 위치가 플레이어의 AOI 영역 중 하나 이상에 있으면 해당 플레이어가 관심을 갖고 이 NetworkObject에 대한 서버 업데이트를 받게 됩니다.

AoiPositionSource는 이 NetworkObject의 위치를 결정하는 데 사용할 NetworkAreaOfInterestBehaviour 컴포넌트를 나타냅니다. null이면 이 개체에서 검색됩니다. NetworkTransformNetworkRigidbodyNetworkAreaOfInterestBehaviour에서 파생되었으며 일반적으로 AoiPositionSource에 사용됩니다.

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에 대한 서버 업데이트를 받을 수 있습니다.

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에 관심이 없는 플레이어에게 전송하지 못하도록 탐지하고 처리할 수 있습니다.

[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 기준으로 Object.SetInterestGroup() 또는 Runner.SetInterestGroup() 메소드를 사용하여 설정합니다.

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에 대한 그룹 관심사를 플레이어에게 명시적으로 할당해야 합니다.

기술문서 TOP으로 돌아가기