관심 관리
개요
관심 관리는 특정 네트워크 오브젝트의 데이터 복제를 클라우드에서 특정 플레이어 클라이언트로 제한하는 데이터 컬링 기능 세트입니다. 이 컬링은 네트워크 트래픽을 줄이는 데 유용합니다.
객체 관심
객체 관심 네트워크 오브젝트별 설정으로, 해당 오브젝트에 대한 플레이어의 관심도를 결정하는 방법을 나타냅니다. 이 네트워크 오브젝트에 관심이 없는 플레이어는 서버 피어로부터 이 오브젝트의 업데이트(네트워크 속성 및 RPC)를 받지 않습니다.
세 가지 NetworkObject.ObjectInterest
옵션이 있습니다:
- 관심 영역: 플레이어의 AOI 영역이 해당 네트워크 오브젝트의 2D/3D 공간상의 위치와 겹치는 경우, 그 플레이어는 이 오브젝트에 관심을 가집니다.
- Global: 모든 플레이어가 이 네트워크 오브젝트의 업데이트를 받습니다.
- Explicit: 오직
SetPlayerAlwaysInterested()
를 사용하여 명시적으로 플래그 된 플레이어만 이 네트워크 오브젝트에 관심을 가집니다.

IInterestEnter / IInterestExit 콜백
InterestEnter(PlayerRef player)
와 InterestExit(PlayerRef player)
는 로컬 플레이어가 해당 오브젝트에 대한 관심을 얻거나 잃을 때, IInterestEnter
와 IInterestExit
인터페이스를 구현한 네트워크 오브젝트의 등록된 컴포넌트에서 호출됩니다. 관심은 오브젝트가 플레이어의 관심 영역 중 하나에 들어오거나 나감으로써, 또는 서버가 명시적으로 SetPlayerAlwaysInterested()
를 설정함으로써 발생할 수 있습니다.
이 콜백은 서버/클라이언트 모드(전용 서버/호스트)일 때 서버에서도 트리거 됩니다. 이는 예를 들어, 어떤 NPC가 모든 플레이어에게 관심이 없을 때 애니메이션을 비활성화하는 등 네트워크 오브젝트의 일부 기능을 서버에서 선택적으로 비활성화하는 데 유용할 수 있습니다.
이 콜백은 로컬 플레이어와 관련된 관심 변화에 대해서만 클라이언트에서 트리거 됩니다. 호스트가 아닌 플레이어는 다른 플레이어의 오브젝트에 대한 관심 변화를 인지하지 못합니다.
IInterestEnter
와 IInterestExit
를 구현한 NetworkBehaviour
는 네트워크 오브젝트에 의해 자동으로 검색되지만, 이 인터페이스를 가진 네트워크 행동이 아닌 컴포넌트는 NetworkRunner
에 수동으로 등록해야 합니다.
중요: 오브젝트가 클라이언트에 스폰 될 때는 플레이어의 관심이 Spawned()
로 암시되므로 IInterestEnter
가 호출되지 않습니다. 따라서 Spawned()
에서 별도의 InterestEnter()
처리를 호출할 수 있습니다.
중요: 오브젝트가 클라이언트에서 Despawn 될 때는 IInterestExit
가 호출되지 않습니다. 따라서 Despawned()
에서 별도의 InterestExit()
처리를 호출할 수 있습니다.
관심 영역
이 객체 관심 모드가 NetworkObject
에 선택되면, 클라우드는 각 클라이언트 플레이어가 정의한 관심 영역(AOI)을 사용하여 해당 네트워크 오브젝트가 플레이어에게 관심 있는지 판단합니다. 플레이어 AOI 영역은 Runner.AddPlayerAreaOfInterest()
메서드를 호출하여 지정됩니다.
중요: 관심 영역 처리가 활성화되려면 네트워크 프로젝트 환경 구성(NPC)의 Replication Features
필드가 Scheduling and Interest Management
로 설정되어 있어야 합니다.

클라이언트는 여러 영역을 정의할 수 있습니다(예: 플레이어가 원격 카메라를 조작하는 경우). 단, 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