This document is about: FUSION 2
SWITCH TO

Interest Management

概要

インタレスト管理はデータカリング機能のセットで、特定のネットワークオブジェクトとネットワークビヘイビアのデータレプリケーションをサーバーから特定のプレーヤークライアントに制限します。このカリングは、ネットワークトラフィックの削減や、プレーヤーのデータへのアクセス制限(チームのみの情報など)に役立ちます。

データのカリングには主に2つのメカニズムがあります:

-**Object Interest:**サーバーからのNetworkObjectの更新を特定のPlayerRefに制限。

  • Behaviour Interest: Serverから特定のPlayerRefへのNetworkBehaviourの更新を制限。

オブジェクトインタレスト

Object Interestはネットワークオブジェクトごとの設定で、そのオブジェクトに対するプレイヤーの関心度を決定します。このNetwork Objectに興味のないプレイヤーは、ServerピアからこのObjectの更新(Networked PropertiesやRPC)を受け取ることができません。

NetworkObject.ObjectInterestオプションは以下の3つです。

  • Area Of Interest: 2D/3D空間でこのネットワークオブジェクトの位置と重なるAOI領域を持つプレイヤーが、このオブジェクトに興味を持つことに。
  • Global*: すべてのプレイヤーがこのネットワークオブジェクトのアップデートを受け取る。
  • Explicit: SetPlayerAlwaysInterested()を使って明示的にフラグを立てたプレイヤーのみが、このネットワークオブジェクトに興味を持つ。
networkobject objectinterest options
Object Interest Options

IInterestEnter / IInterestExit コールバック

IntrestEnter(PlayerRef player)InterestExit(PlayerRef player)は、IInterestEnterIInterestExitインタフェースを実装しているネットワークオブジェクトの登録コンポーネントで、ローカルプレイヤーがそのオブジェクトに興味を持ったり失ったりするたびに呼び出されます。興味の獲得/喪失は、オブジェクトがプレイヤーのArea Of Interest領域の1つに入ったり出たりすることによって、またはサーバーが明示的に SetPlayerAlwaysInterested() を設定することによって行われます。

これらのコールバックは、Server/Client Mode (Dedicated Server/Host)のときにもServer上でトリガーされます。これは、ネットワークオブジェクトがすべてのプレイヤーの関心から外れている場合に、サーバ上で選択的に無効にするのに便利です(たとえば、NPCが、関心を持つPlayerが誰もいないときにアニメーションを無効にしたい場合など)。

このコールバックは、ローカル プレイヤーに関連する興味の変化に対してのみ、クライアント上でトリガーされます。ホスト以外のプレイヤーは、他のプレイヤーがオブジェクトに興味を持っていることを知りません。

NetworkBehaviour 内の IInterestEnterIInterestExit の実装は、自動的に Network Object によって検出されますが、これらのインターフェイスを持つ NetworkBehaviour 以外の派生コンポーネントは、手動で NetworkRunner に登録する必要があります。

重要: ObjectがクライアントにSpawnされるとき、InterestEnterは呼ばれません。InterestEnter()固有の処理を Spawned() の中で呼び出したいかもしれません。

重要: IInterestExit はオブジェクトがクライアント上でデスポーンされたときに呼び出されることはありません。Despawnned()の中で InterestEnter() 固有の処理を呼ぶ場合もあります。

関心領域

このオブジェクトのインタレストモードが NetworkObject で選択されると、サーバーピア (Shared Mode を使用している場合は Shared Mode サーバーを含む) は、各クライアントプレイヤーが定義した AOI (Area Of Interest) 領域を使用して、そのネットワークオブジェクトがそのプレイヤーにとって関心のあるものかどうかを判断します。プレイヤーの AOI 領域は Runner.AddPlayerAreaOfInterest() メソッドを呼び出すことで指定します。

重要: Area Of Interest の処理を有効にするには、Network Project Config (NPC) の Replication Features フィールドを Scheduling and Interest Management に設定する必要があります。

enable interest management
Enable Interest Management in NetworkProjectConfig.

重要: AddPlayerAreaOfInterest()で設定した地域は1ティック分しか適用されません。

クライアントは複数の地域を定義することができます(たとえば、プレイヤーがリモートカメラを操作している場合など)。NetworkObjectがPlayerのAOIリージョンの1つ以上に含まれる場合、そのPlayerは関心を持ち、サーバーからそのNetworkObjectのサーバー更新を受け取ります。

NetworkTRSP の要件

Area Of Interestシステムは、オブジェクトの位置を決定するために NetworkTRSP クラスの位置値を使用します。ネットワークオブジェクトが AOI 処理に参加するには、NetworkObject コンポーネントと同じ GameObject 上に NetworkTRSP 派生クラスがなければなりません。

NetworkTRSPの詳細はこちらを参照してください。

これらのFusionのコンポーネントは NetworkTRSP から派生したもので、AOIと互換性があります。

  • NetworkTransform
  • NetworkRigidbody3D (Unity Physics Addon)
  • NetworkRigidbody2D (Unity Physics Addon)
  • NetworkCharacterControllerPrototype(ネットワークキャラクターコントローラプロトタイプ
  • The Advanced KCC アドオン

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() または Runner.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);
}

グローバル

このNetworkObjectは、すべてのプレイヤーにとって常に関心のあるオブジェクトです。これにより、この Network Object の Object Culling が事実上無効になり、すべての Players がこの NetworkObject の Server 更新を受信します。

Explicit

この Network Object は、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 は、NetworkObject のインスタンスにバインドされる非静的 RPC の配信にも影響します。oRpcInvokeInfo の戻り値は、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.");
    }
  }
}

Behaviour Interest

Serverモード(Dedicated/Host/Single Player)のサーバーピアは、ネットワークビヘイビアのすべてのネットワークプロパティ(ステート)のレプリケーションを特定のプレイヤーだけに制限することができます。

ReplicateTo(PlayerRef player)メソッドは、カスタム実装でオーバーライドして、異なるプレイヤーに選択的にTrueまたはFalseを返すことができます。

注意: このメソッドはサーバー・モードとホスト・モード(共有モードではありません)でのみ有効です。 また、ReplicateTo()はServerピアでのみ有効です。

注意: Object 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