This document is about: FUSION 2-SHARED
SWITCH TO

관심 관리

개요

관심 관리는 특정 네트워크 오브젝트의 데이터 복제를 클라우드에서 특정 플레이어 클라이언트로 제한하는 데이터 컬링 기능 세트입니다. 이 컬링은 네트워크 트래픽을 줄이는 데 유용합니다.

객체 관심

객체 관심 네트워크 오브젝트별 설정으로, 해당 오브젝트에 대한 플레이어의 관심도를 결정하는 방법을 나타냅니다. 이 네트워크 오브젝트에 관심이 없는 플레이어는 서버 피어로부터 이 오브젝트의 업데이트(네트워크 속성 및 RPC)를 받지 않습니다.

세 가지 NetworkObject.ObjectInterest 옵션이 있습니다:

  • 관심 영역: 플레이어의 AOI 영역이 해당 네트워크 오브젝트의 2D/3D 공간상의 위치와 겹치는 경우, 그 플레이어는 이 오브젝트에 관심을 가집니다.
  • Global: 모든 플레이어가 이 네트워크 오브젝트의 업데이트를 받습니다.
  • Explicit: 오직 SetPlayerAlwaysInterested()를 사용하여 명시적으로 플래그 된 플레이어만 이 네트워크 오브젝트에 관심을 가집니다.
NetworkObject ObjectInterest Options
Object Interest 옵션

IInterestEnter / IInterestExit 콜백

InterestEnter(PlayerRef player)InterestExit(PlayerRef player)는 로컬 플레이어가 해당 오브젝트에 대한 관심을 얻거나 잃을 때, IInterestEnterIInterestExit 인터페이스를 구현한 네트워크 오브젝트의 등록된 컴포넌트에서 호출됩니다. 관심은 오브젝트가 플레이어의 관심 영역 중 하나에 들어오거나 나감으로써, 또는 서버가 명시적으로 SetPlayerAlwaysInterested()를 설정함으로써 발생할 수 있습니다.

이 콜백은 서버/클라이언트 모드(전용 서버/호스트)일 때 서버에서도 트리거 됩니다. 이는 예를 들어, 어떤 NPC가 모든 플레이어에게 관심이 없을 때 애니메이션을 비활성화하는 등 네트워크 오브젝트의 일부 기능을 서버에서 선택적으로 비활성화하는 데 유용할 수 있습니다.

이 콜백은 로컬 플레이어와 관련된 관심 변화에 대해서만 클라이언트에서 트리거 됩니다. 호스트가 아닌 플레이어는 다른 플레이어의 오브젝트에 대한 관심 변화를 인지하지 못합니다.

IInterestEnterIInterestExit를 구현한 NetworkBehaviour는 네트워크 오브젝트에 의해 자동으로 검색되지만, 이 인터페이스를 가진 네트워크 행동이 아닌 컴포넌트는 NetworkRunner에 수동으로 등록해야 합니다.

중요: 오브젝트가 클라이언트에 스폰 될 때는 플레이어의 관심이 Spawned()로 암시되므로 IInterestEnter가 호출되지 않습니다. 따라서 Spawned()에서 별도의 InterestEnter() 처리를 호출할 수 있습니다.

중요: 오브젝트가 클라이언트에서 Despawn 될 때는 IInterestExit가 호출되지 않습니다. 따라서 Despawned()에서 별도의 InterestExit() 처리를 호출할 수 있습니다.

관심 영역

이 객체 관심 모드가 NetworkObject에 선택되면, 클라우드는 각 클라이언트 플레이어가 정의한 관심 영역(AOI)을 사용하여 해당 네트워크 오브젝트가 플레이어에게 관심 있는지 판단합니다. 플레이어 AOI 영역은 Runner.AddPlayerAreaOfInterest() 메서드를 호출하여 지정됩니다.

중요: 관심 영역 처리가 활성화되려면 네트워크 프로젝트 환경 구성(NPC)의 Replication Features 필드가 Scheduling and Interest Management로 설정되어 있어야 합니다.

Enable Interest Management
NetworkProjectConfig에서 관심 관리 활성화.

클라이언트는 여러 영역을 정의할 수 있습니다(예: 플레이어가 원격 카메라를 조작하는 경우). 단, Shared Mode에서는 하나의 관심 영역만 지원됩니다. 네트워크 오브젝트가 플레이어의 AOI 영역 중 하나 이상에 속하면, 해당 플레이어는 관심을 가지며 서버로부터 이 NetworkObject의 업데이트를 받게 됩니다.

중요: 공유 모드에서는 AddPlayerAreaOfInterest()로 플레이어에 새 관심 영역을 추가하면 이전의 관심 영역이 삭제됩니다. 공유 모드는 플레이어 당 하나의 관심 영역만 지원합니다.

NetworkTransform 요구사항

Fusion의 컴포넌트는 NetworkTRSP에서 파생되며 AOI 호환성을 가집니다:
관심 영역 시스템은 NetworkTransform 클래스의 위치 값을 사용하여 오브젝트의 위치를 결정합니다. AOI 처리를 위해 네트워크 오브젝트는 NetworkObject 컴포넌트와 동일한 게임 오브젝트에 NetworkTransform 컴포넌트를 가지고 있어야 합니다.

NetworkTransform에 대한 자세한 내용은 여기를 참조하세요.

AddPlayerAreaOfInterest 사용법

C#

public class SetAreaOfInterest : NetworkBehaviour
{
  public float Extents = 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.IsNone)
      {
        Runner.AddPlayerAreaOfInterest(controller, transform.position, Extents);
      }
    }
  }
}

참고: Object.SetPlayerAlwaysInterested()는 AOI 외에도 사용되어, 플레이어의 AOI 범위 밖에 있더라도 해당 오브젝트에 대한 관심을 강제로 부여할 수 있습니다.

Global

NetworkObject는 모든 플레이어에게 항상 관심 대상입니다. 이는 이 네트워크 오브젝트에 대한 객체 컬링을 사실상 비활성화하며, 모든 플레이어가 이 NetworkObject의 서버 업데이트를 받게 됩니다.

Explicit

이 네트워크 오브젝트는 플레이어의 관심이 Runner.SetPlayerAlwaysInterested()로 명시적으로 추가되지 않는 한, 어느 플레이어에게도 관심 대상이 되지 않습니다. 명시적으로 관심을 부여받은 플레이어만이 이 네트워크 오브젝트의 서버 업데이트를 받게 됩니다.

C#

public class MakeAlwaysInterested : NetworkBehaviour, IPlayerJoined
{
  void IPlayerJoined.PlayerJoined(PlayerRef player)
  {
    if (Runner.IsServer)
    {
      Object.SetPlayerAlwaysInterested(player, true);
      // or
      // Runner.SetPlayerAlwaysInterested(player, Object, true);
    }
  }
}

RPC와 Object Interest

Object Interest는 인스턴스에 바인딩 된 비정적 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.");
    }
  }
}
Back to top