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()
を使って明示的にフラグを立てたプレイヤーのみが、このネットワークオブジェクトに興味を持つ。
IInterestEnter / IInterestExit コールバック
IntrestEnter(PlayerRef player)
とInterestExit(PlayerRef player)
は、IInterestEnter
とIInterestExit
インタフェースを実装しているネットワークオブジェクトの登録コンポーネントで、ローカルプレイヤーがそのオブジェクトに興味を持ったり失ったりするたびに呼び出されます。興味の獲得/喪失は、オブジェクトがプレイヤーのArea Of Interest領域の1つに入ったり出たりすることによって、またはサーバーが明示的に SetPlayerAlwaysInterested()
を設定することによって行われます。
これらのコールバックは、Server/Client Mode (Dedicated Server/Host)のときにもServer上でトリガーされます。これは、ネットワークオブジェクトがすべてのプレイヤーの関心から外れている場合に、サーバ上で選択的に無効にするのに便利です(たとえば、NPCが、関心を持つPlayerが誰もいないときにアニメーションを無効にしたい場合など)。
このコールバックは、ローカル プレイヤーに関連する興味の変化に対してのみ、クライアント上でトリガーされます。ホスト以外のプレイヤーは、他のプレイヤーがオブジェクトに興味を持っていることを知りません。
NetworkBehaviour
内の IInterestEnter
と IInterestExit
の実装は、自動的に 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
に設定する必要があります。
重要: 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