관심 관리
개요
관심 관리는 특정 네트워크 오브젝트와 네트워크 행동의 데이터 복제를 서버에서 특정 플레이어 클라이언트로 제한하는 데이터 컬링 기능 세트입니다. 이 컬링 기능은 네트워크 트래픽을 줄이고, 팀 전용 정보와 같은 데이터에 대한 플레이어 접근을 제한하는 데 유용합니다.
객체 관심
객체 관심 네트워크 오브젝트별 설정으로, 해당 오브젝트에 대한 플레이어의 관심도를 결정하는 방법을 나타냅니다. 이 네트워크 오브젝트에 관심이 없는 플레이어는 서버 피어로부터 이 오브젝트의 업데이트(네트워크 속성 및 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
에 선택되면, 서버 피어(Shared Mode 사용 시 Shared Mode 서버 포함)는 각 클라이언트 플레이어가 정의한 관심 영역(AOI)을 사용하여 해당 네트워크 오브젝트가 플레이어에게 관심 있는지 판단합니다. 플레이어 AOI 영역은 Runner.AddPlayerAreaOfInterest()
메서드를 호출하여 지정됩니다.
중요: 관심 영역 처리가 활성화되려면 네트워크 프로젝트 환경 구성(NPC)의 Replication Features
필드가 Scheduling and Interest Management
로 설정되어 있어야 합니다.

클라이언트는 여러 영역을 정의할 수 있습니다(예: 플레이어가 원격 카메라를 조작하는 경우). 단, Shared Mode에서는 하나의 관심 영역만 지원됩니다. 네트워크 오브젝트가 플레이어의 AOI 영역 중 하나 이상에 속하면, 해당 플레이어는 관심을 가지며 서버로부터 이 NetworkObject
의 업데이트를 받게 됩니다.
중요: 공유 모드에서는 AddPlayerAreaOfInterest()
로 플레이어에 새 관심 영역을 추가하면 이전의 관심 영역이 삭제됩니다. 공유 모드는 플레이어 당 하나의 관심 영역만 지원합니다.
NetworkTRSP 요구사항
관심 영역 시스템은 NetworkTRSP
클래스의 위치 값을 사용하여 오브젝트의 위치를 결정합니다. AOI 처리를 위해 네트워크 오브젝트는 NetworkObject
컴포넌트와 동일한 게임 오브젝트에 NetworkTRSP
파생 클래스가 있어야 합니다.
NetworkTRSP
에 대한 자세한 내용은 여기를 참조하세요.
Fusion의 다음 컴포넌트는 NetworkTRSP
에서 파생되어 AOI 호환성을 가집니다:
NetworkTransform
NetworkRigidbody3D
(Unity Physics Addon)NetworkRigidbody2D
(Unity Physics Addon)NetworkCharacterControllerPrototype
- Advanced KCC Add-on
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 범위 밖에 있더라도 해당 오브젝트에 대한 관심을 강제로 부여할 수 있습니다.
AreaOfInterestOverride
자세한 내용은 NetworkTransform의 AreaOfInterestOverride를 참조하세요.
AreaOfInterestOverride
는 기본 NetworkTRSP
에 설정되어, 서버가 플레이어의 관심을 판단할 때 다른 네트워크 오브젝트의 TRSP 데이터를 사용하도록 지시할 수 있습니다.
C#
public void ChangeAOIOverride(NetworkObject proxyObject)
{
// Any NetworkTRSP derived component (such as NetworkTransform)
// on the root of an NetworkObject is referred to as the Main TRSP,
// This main NetworkTRSP component is used to determine AOI for the NetworkObject.
var mainTRSP = Object.GetComponent<NetworkTRSP>();
// Setting AreaOfInterestOverride on the main NetworkTRSP tells Fusion to use the
// Area Of Interest results of different NetworkObject to determine this Object's Interest.
// Setting this to 'null' disables the override.
Object.GetComponent<NetworkTRSP>().SetAreaOfInterestOverride(proxyObject);
}
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.");
}
}
}
행동 관심
서버 모드(전용/호스트/싱글 플레이어)의 서버 피어는 특정 플레이어에게만 네트워크 행동의 모든 네트워크 속성(상태) 복제를 제한할 수 있습니다.
ReplicateTo(PlayerRef player)
메서드는 플레이어별로 true 또는 false를 반환하도록 사용자 정의 구현할 수 있습니다.
참고: 이 기능은 서버 모드 및 호스트 모드에서만 적용되며(Shared Mode에서는 적용되지 않음), ReplicateTo()
는 서버 피어에서만 유효합니다. 서버 모드에서는 서버가 유일한 상태 권한을 가지기 때문입니다.
참고: Object Interest는 Behaviour Interest보다 먼저 결정됩니다. 만약 네트워크 오브젝트가 플레이어의 관심 대상이 아니라면, 해당 오브젝트의 네트워크 행동은 어떤 플레이어에게도 복제되지 않습니다.
참고: Behaviour Interest는 네트워크 속성([Networked]
어트리뷰트가 붙은 속성)에만 영향을 주며, 원격 프로시저 호출(RPC)의 복제에는 영향을 주지 않습니다.
사용 예시
C#
using Fusion;
public class InterestManagementSampleCode : NetworkBehaviour
{
// Because this NetworkBehaviour is restricted to even players by the ReplicateTo() override
// Only clients with an even LocalPlayer value will get updates for this value.
// For odd-numvered players this value will remain zero.
[Networked]
int secretNumberOnlyEvenPlayersShouldKnow { get; set;}
// NOTE: This method is only ever called on the Server in Server Mode
// and is not applicable to Shared Mode
protected override bool ReplicateTo(PlayerRef player)
{
// Only replicate this behaviours state to Players with even numbered PlayerIDs
return player.PlayerId % 2 == 0;
}
}
Back to top