Version: 2020.1
言語: 日本語
ネットワークでの可視性
シーンのゲームオブジェクト

ネットワークでの可視性をカスタマイズ

Note: UNet is deprecated, and will be removed from Unity in the future. A new system is under development. For more information and next steps see this blog post.

ビルトインの Network Proximity Checker コンポーネントは、ゲームオブジェクトのネットワークでの可視性を判断するためのビルトインのデフォルトコンポーネントです。ただし、これは距離に基づいた確認しか行いません。場合によっては、グリッドに基づいたルール、見通し線テスト、ナビゲーションパステスト、その他、ゲームに適切なさまざまな種類の可視テストを使用したい場合があるかもしれません。

そのためには、Network Proximity Checker と同様な独自のカスタムのシステムを実装する必要があります。カスタム実装のためには、 Network Proximity Checker の仕組みを理解する必要があります。ドキュメントの Network Proximity Checker componentNetworkProximityChecker API を参照してください。

NetworkProximityChecker は、Unity の Multiplayer HLAPI のパブリックの 可視性インターフェース を使用して実装されています。このインターフェースを使用することで、開発者が望むすべての種類の可視性ルールを実装できます。各 NetworkIdentity は、可視であるプレイヤーのセットを追跡します。 NetworkIdentity ゲームオブジェクトを見ることができるこれらのプレイヤーは NetworkIdentity の「観察者」と呼ばれます。

Network Proximity Checker は決められた時間間隔 (インスペクターの Vis Update Interval 値を使って設定) で Network Identity componentRebuildObservers 関数を呼び出します。そのため、各プレイヤーのネットワークで可視のゲームオブジェクトのセットは、ゲームオブジェクトが動くにしたがって更新されます。

NetworkBehaviour クラス (ここからネットワーク化のスクリプトを継承) には、可視範囲を決定するための仮想関数がいくつかあります。

  • OnCheckObserver - この関数は、新しいプレイヤーがゲームに参加したときに、ネットワークに接続された各ゲームオブジェクトのサーバー上で呼び出されます。true を返す場合は、そのプレイヤーはゲームオブジェクトの観察者に加えられます。NetworkProximityChecker メソッドは、この関数で簡単な距離の確認を行います。そして、Physics.OverlapSphere() を使ってこのオブジェクトにとって可視距離内のプレイヤーを探します。

  • OnRebuildObservers - RebuildObservers が呼び出されると、OnRebuildObservers メソッドがサーバー上で呼び出されます。OnRebuildObservers 関数は、オブジェクトを見ることができるプレイヤーを観察者のセットに加えます。次に、NetworkServer は、古い可視性セットと新しい可視性セットとの間の差異に基づいて、 ObjectHideObjectSpawn メッセージの送信を処理します。

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);
            }
        }
ネットワークでの可視性
シーンのゲームオブジェクト