ノート: UNet は非推奨となり、今後 Unity から削除される予定です。新しいシステムが開発中です。詳細は ブログ と FAQ を参照してください。 |
ビルトインの Network Proximity Checker コンポーネントは、ゲームオブジェクトのネットワークでの可視性を判断するためのビルトインのデフォルトコンポーネントです。ただし、これは距離に基づいた確認しか行いません。場合によっては、グリッドに基づいたルール、見通し線テスト、ナビゲーションパステスト、その他、ゲームに適切なさまざまな種類の可視テストを使用したい場合があるかもしれません。
そのためには、Network Proximity Checker と同様な独自のカスタムのシステムを実装する必要があります。カスタム実装のためには、 Network Proximity Checker の仕組みを理解する必要があります。ドキュメントの Network Proximity Checker component と NetworkProximityChecker API を参照してください。
NetworkProximityChecker は、Unity の Multiplayer HLAPI のパブリックの 可視性インターフェース を使用して実装されています。このインターフェースを使用することで、開発者が望むすべての種類の可視性ルールを実装できます。各 NetworkIdentity は、可視であるプレイヤーのセットを追跡します。 NetworkIdentity ゲームオブジェクトを見ることができるこれらのプレイヤーは NetworkIdentity の「観察者」と呼ばれます。
Network Proximity Checker は決められた時間間隔 (インスペクターの Vis Update Interval 値を使って設定) で Network Identity component の RebuildObservers 関数を呼び出します。そのため、各プレイヤーのネットワークで可視のゲームオブジェクトのセットは、ゲームオブジェクトが動くにしたがって更新されます。
NetworkBehaviour
クラス (ここからネットワーク化のスクリプトを継承) には、可視範囲を決定するための仮想関数がいくつかあります。
OnCheckObserver - この関数は、新しいプレイヤーがゲームに参加したときに、ネットワークに接続された各ゲームオブジェクトのサーバー上で呼び出されます。true を返す場合は、そのプレイヤーはゲームオブジェクトの観察者に加えられます。NetworkProximityChecker
メソッドは、この関数で簡単な距離の確認を行います。そして、Physics.OverlapSphere()
を使ってこのオブジェクトにとって可視距離内のプレイヤーを探します。
OnRebuildObservers - RebuildObservers
が呼び出されると、OnRebuildObservers メソッドがサーバー上で呼び出されます。OnRebuildObservers 関数は、オブジェクトを見ることができるプレイヤーを観察者のセットに加えます。次に、NetworkServer は、古い可視性セットと新しい可視性セットとの間の差異に基づいて、 ObjectHide
と ObjectSpawn
メッセージの送信を処理します。
NetworkIdentity
が有効な connectionToClient を持っているかどうかを調べることによって、ネットワーク化されたゲームオブジェクトがプレイヤーであるかどうかを調べることができます。 以下はその例です。
var hits = Physics.OverlapSphere(transform.position, visRange);
foreach (var hit in hits)
{
// (ゲームオブジェクトが connectionToClient を持つ場合は、プレイヤーです)
var uv = hit.GetComponent<NetworkIdentity>();
if (uv != null && uv.connectionToClient != null)
{
observers.Add(uv.connectionToClient);
}
}