仮想と物理とエトセトラ

xRや物理とかごった煮の備忘録的技術ブログ

MLAPIをHoloLensでつかう その2(ユーザの位置共有をしてみる)

今回は前回の続きです。

xr-physics-work-etc.hatenablog.com

今回もMLAPIのチュートリアルに沿いつつやっていきます。

docs-multiplayer.unity3d.com

NetworkManagerを設定する

Hierarchy上で空のGameObjectを作成し、NetworkManagerに名前を変更します。
作成したGameObjectにNetworkManagerコンポーネントをアタッチします。
NetworkManagerコンポーネントは名前の通り、共有用の接続を管理しています。 アタッチしたら、NetworkManagerコンポーネントSelect transport...からUnetTransportを選択します。

f:id:napo909:20210711102305p:plain

UNetTransportを選択すると、UNetTransportコンポーネントがアタッチされます。
ここに、接続先のIPアドレスや、ポート番号の情報を設定します。

f:id:napo909:20210711102648p:plain

PlayerPrefabを作る

ユーザの位置や操作を伝えるためのPlayerオブジェクトを作成します。
今回はユーザの頭の位置を共有するため、SphereをScene上に作成し、サイズを調整した後NetworkObjectコンポーネントをアタッチします。
名前をPlayerに変更しておきます。

f:id:napo909:20210711101618p:plain

次に、頭の位置を追従するように、playerTracking.csを作成し、PlayerオブジェクトにNetworkTransformコンポーネントと合わせてアタッチします。 構成はPhotonの時とほぼ同じです。

xr-physics-work-etc.hatenablog.com

MLAPIのNetworkBehaviourを継承し、自分が所有するPlayerオブジェクトに対して、camera位置とオブジェクト位置を一致させます。

  • playerTracking.cs
クリックで展開
using UnityEngine;
using MLAPI;
public class PlayerTracking : NetworkBehaviour
{

    // Update is called once per frame
    void Update()
    {
        if(IsOwner)
        {
            // 自オブジェクトの場合
            SetPlayerTransform();
        }


    }

    /// <summary>
    /// プレイヤー位置設定関数
    /// </summary>
    void SetPlayerTransform()
    {
        // カメラ位置にオブジェクトを移動
        this.transform.position = Camera.main.transform.position;
        this.transform.rotation = Camera.main.transform.rotation;
    }
}

f:id:napo909:20210711123746p:plain

作成したPlayerオブジェクトをAsset→Prefabsにドラッグ&ドロップしてPrefab化します。
Prefab化したら、Hierarchy上のPlayerオブジェクトを削除します。

f:id:napo909:20210711112944p:plain

Prefabを作成したら、Hierarchy上のNetworkManagerコンポーネントを選択し、NetworkPrefabにPlayerプレハブを設定します。
今回作成したのはPlayerなので、Default Player Prefabにチェックを入れます。
f:id:napo909:20210711103047p:plain

HoloLens用の接続用ボタンを用意する

UnityEditorの場合は、InspectorからHostやClientとして接続するボタンがありますが、HoloLensの場合そうはいきません。

f:id:napo909:20210711104544p:plain

簡単に接続用のボタンを用意します。
※接続先IPアドレスなどの設定も今後は必要ですが、今回は割愛。
GridObjectCollectionを用いて4つのボタンを整列して配置します。

f:id:napo909:20210711125642p:plain

f:id:napo909:20210711114634p:plain

f:id:napo909:20210711115222p:plain

ConnectButtonCollectionに、接続ボタン用のNetworkConnectButtonFunctions.csをアタッチします。

  • NetworkConnectButtonFunctions.cs
クリックで展開
using UnityEngine;
using MLAPI;

public class NetworkConnectButtonFunctions : MonoBehaviour
{
    /// <summary>
    /// ネットワークマネージャ
    /// </summary>
    private NetworkManager networkManager;


    void Start()
    {
        // ネットワークマネージャインスタンス取得
        networkManager = NetworkManager.Singleton;
        if(networkManager == null)
        {
            this.gameObject.SetActive(false);
        }
    }

    /// <summary>
    /// ホストとして接続
    /// </summary>
    public void ConnectAsHost()
    {
        networkManager.StartHost();
    }

    /// <summary>
    /// サーバとして接続
    /// </summary>
    public void ConnectAsServer()
    {
        networkManager.StartServer();
    }

    /// <summary>
    /// クライアントとして接続
    /// </summary>
    public void ConnectAsClient()
    {
        networkManager.StartClient();
    }

    /// <summary>
    /// 接続切断
    /// </summary>
    public void Disconnect()
    {
        if(networkManager.IsHost)
        {
            networkManager.StopHost();
        }
        else if(networkManager.IsServer)
        {
            networkManager.StopServer();
        }
        else if(networkManager.IsClient)
        {
            networkManager.StopClient();
        }
        else
        {
            // ここには入らない
        }
        
    }
}

各ボタンに対応する関数を設定します。

f:id:napo909:20210711114908p:plain

動作確認

プロジェクトをビルドする前に「Build Settings」→「Player Settings」→「Player」→「Publishing Settings」→「Capabilities」から下記にチェックを付けます。

  • InternetClientServer
  • PrivateNetworkClientServer

f:id:napo909:20210711120536p:plain

その後、ビルドを実施し、HoloLens2にアプリを入れます。

今回は、HoloLens2(Host)⇔PC(UnityEditor, Client)間で確認します。
HoloLens2でアプリを起動したら、自分のIPアドレスを確認します。 (「自分のIP」のボイスコマンドやWi-Fiの詳細情報を確認)

確認したHoloLens2のIPアドレスをPC側のNetworkManagerオブジェクトのUNET TransportConnect Addressに設定します。

f:id:napo909:20210711124648p:plain

その後、HoloLens側でConnect Host、PC側でConnect Clientボタンを押して接続します。
正しく接続できると、各ユーザの頭の位置が球体で示されます。
HoloLens2をかぶっている頭を動かすと、PC側にも反映されます。

f:id:napo909:20210711125017g:plain

これでMLAPIを用いたHoloLens2でのローカルネットワーク経由の共有が実施できました。
次回は物体の操作を共有します。