MRが楽しい

MRやVRについて学習したことを書き残す

SharingWithUNETについてまとめる その3

本日は HoloToolKit の調査枠です。
SharingWithUNET のサンプルシーンを確認していきます。
bluebirdofoz.hatenablog.com

今回は UNETSharingStage オブジェクトにある NetworkDiscoveryWithAnchor について機能を確認します。
f:id:bluebirdofoz:20180105223519j:plain

NetworkDiscoveryWithAnchor はブロードキャスト送信で共有アンカーの管理を行います。
サーバの場合、アンカーの作成と他クライアントへのブロードキャスト処理を開始します。
クライアントの場合、サーバからのブロードキャスト受信処理を開始します。
スクリプトはNetworkDiscovery コンポーネントを継承しています。

ただし実際にアンカーデータの送受信を実行するのは GenericNetworkTransmitter です。
スクリプトはサーバ、クライアントのIPアドレス検出まで実行します。

自作アプリを組み込む際にはひとまずノータッチでも問題なさそうです。

Broadcast Port

ブロードキャストを行い、リッスンするネットワークポート

Broadcast Key

ブロードキャストでこのアプリケーションを識別するキー

Broadcast Version

ブロードキャストするアプリケーションのバージョン。
同じアプリケーションのバージョンと一致させるために使用される。

Broadcast SubVersion

ブロードキャストするアプリケーションのサブバージョン。
同じアプリケーションのバージョンと一致させるために使用される。

Broadcast Interval

サーバーを走らせているときのブロードキャストする頻度(ミリ秒)

Use NetworkManager

ネットワークマネージャーと統合する場合、 True 。
サーバーとして実行しているとき、ブロードキャストメッセージにネットワークマネージャーのアドレスが含まれる。
クライアントとして実行しているとき、 NetworkManager を使用して見つかったマッチングゲームに参加できる。

Broadcast Data

サーバーとして実行しているとき、ブロードキャストメッセージに含めるデータ
NetworkManager インテグレーションを使用すると NetworkManager のアドレスで上書きされる。

Show GUI

デフォルトの Broadcast Control UI を描画する場合、True。

参考ページ
docs.unity3d.com


サーバ側の初期化処理
HoloLens 上では UNetAnchorManager にアンカーの作成を依頼します。
・NetworkDiscoveryWithAnchors.cs

        /// <summary>
        /// サーバを初期化する。
        /// </summary>
        /// <returns></returns>
        private IEnumerator InitAsServer()
        {
            Debug.Log("Acting as host");
#if !UNITY_EDITOR && UNITY_WSA
            // NetworkManagerに自身のIPアドレスをサーバアドレスとして設定する。
            NetworkManager.singleton.serverBindToIP = true;
            NetworkManager.singleton.serverBindAddress = LocalIp;
#endif
            // ※ yield return null (コルーチン)の役割。
            //    return null はココで処理を中断するということです。
            //    Unityでは、1フレーム分中断して、次のフレームで続きの行の処理を行います。

            // StopBroadcast will also 'StopListening'
            // ブロードキャストの実行と受信を停止する。
            StopBroadcast();

            // Work-around when building to the HoloLens with "Compile with .NET Native tool chain".
            // Need a frame of delay after StopBroadcast() otherwise clients won't connect.
            // "Compile with .NET Native tool chain" をHoloLensに組み込むときの回避策。
            // StopBroadcast()の後に遅延のフレームが必要です。そうしないと、クライアントは接続しません。
            yield return null;

            // Starting as a 'host' makes us both a client and a server.
            // There are nuances to this in UNet's sync system, so do make sure
            // to test behavior of your networked objects on both a host and a client 
            // device.
            // 「ホスト」として開始することで、自身はクライアントとサーバーの両方になります。
            // UNetのシンクシステムにはホストの動作に微妙な差異があります。
            // ホストデバイスとクライアントデバイスの両方でネットワークオブジェクトの動作をテストするようにしてください。
            NetworkManager.singleton.StartHost();

            // Work-around when building to the HoloLens with "Compile with .NET Native tool chain".
            // Need a frame of delay between StartHost() and StartAsServer() otherwise clients won't connect.
            // "Compile with .NET Native tool chain" をHoloLensに組み込むときの回避策。
            // StartHost()とStartAsServer()の間に遅延のフレームが必要です。さもなくばクライアントが接続しません。
            yield return null;

            // Start broadcasting for other clients.
            // 他のクライアントへのブロードキャストを開始します。
            StartAsServer();

#if !UNITY_EDITOR && UNITY_WSA
            // Start creating an anchor.
            // アンカーの作成を開始します。
            UNetAnchorManager.Instance.CreateAnchor();
#else
            // UnityEditor上の動作であればアンカーは作成しません。
            Debug.LogWarning("This script will need modification to work in the Unity Editor");
#endif
        }


クライアント側の初期化処理
HoloLens 上では GenericNetworkTransmitter にアンカーデータを取得するIPアドレスを設定します。
・NetworkDiscoveryWithAnchors.cs

        /// <summary>
        /// Call to join a sessoin
        /// セッションに参加するために呼び出します。
        /// </summary>
        /// <param name="session">Information about the session to join(参加するセッションに関する情報)</param>
        public void JoinSession(SessionInfo session)
        {
            // ブロードキャストを停止する。
            StopListening();
            // We have to parse the server IP to make the string friendly to the windows APIs.
            // 我々は文字列をWindows APIに利用するために、サーバのIPを解析する必要があります。
            // ブロードキャストを送信したシステムのIPアドレスを取得する。
            ServerIp = session.SessionIp;
            // 取得したIPアドレスをNetworkManagerのネットワークアドレスとして登録する。
            NetworkManager.singleton.networkAddress = ServerIp;
#if !UNITY_EDITOR && UNITY_WSA
            // Tell the network transmitter the IP to request anchor data from if needed.
            // 必要に応じてアンカーデータを要求するIPをネットワークトランスミッタに伝えます。
            GenericNetworkTransmitter.Instance.SetServerIp(ServerIp);
#else
            Debug.LogWarning("This script will need modification to work in the Unity Editor");
#endif
            // And join the networked experience as a client.
            // クライアントとしてネットワーク化されたエクスペリエンスに参加する。
            // NetworkManagerをクライアントとして開始する。
            NetworkManager.singleton.StartClient();
            // 接続または切断時に発生するイベントを呼び出す。
            SignalConnectionStatusEvent();
        }