仮想と物理とエトセトラ

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

Netcode for GameObjects (旧MLAPI)をHoloLensで使ってみる その1

今回は、Unity公式の共有フレームワークのNetcode for GameObjectsを触ってみます。

docs-multiplayer.unity3d.com

元になったMLAPIについては以前触れていますが、v.0.1.0からv.1.0.0になって変更点があると思われるので、確認の意味も込めて触れてみます。

xr-physics-work-etc.hatenablog.com

前提

Netcode for GameObjectsではUnity 2020.3, 2021.1, and 2021.2を推奨しているので、以下を使用します。

Unity 2020.3.16
MRTK 2.7.3

MRTKの導入~ HoloLensアプリ向けの設定は下記を参考にできます。

bluebirdofoz.hatenablog.com

Netcode for GameObjectsを導入する

公式のチュートリアルを元に実施します。

docs-multiplayer.unity3d.com

上部メニューのWindow→Pacakge ManagerからPackage Managerウィンドウを表示します。
f:id:napo909:20220109145039p:plain

Pakcage Managerウィンドウ左上の+ボタンを押して、Add package from git URL...を選択します。

f:id:napo909:20220109145502p:plain

出てくるInputFieldに下記文字列を入力してAddボタンを押します。
com.unity.netcode.gameobjects

f:id:napo909:20220109150233p:plain

正常に読み込まれると、リストにNetcode for GameObjectsが追加されます。
f:id:napo909:20220109150418p:plain

Packageを見てNetcode for GameObjectsフォルダが存在すれば正しく取り込まれています。
f:id:napo909:20220109151522p:plain

お試し実装

チュートリアルHello Worldをベースに、お試しで実装してみます。

まずはユーザを示すPrefabを作成します。
Scene上にSphereを追加し、NetworkObjectコンポーネントをアタッチします。
方向がわかるようにz方向のScaleを変更しておきます。
f:id:napo909:20220109152739p:plain

次に、ユーザ頭位置を示すようにMLAPIの際に使用したスクリプトを一部修正して作成し、アタッチします。
合わせて、Tramsformを共有対象とする、NetworkTransform もアタッチします。

xr-physics-work-etc.hatenablog.com

  • PlayerTracking.cs
クリックで展開
using UnityEngine;
using Unity.Netcode;
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:20220109153627p:plain

作成したGameObjectをPlayerに名称を変更し、Assets中にドラッグ&ドロップしてPrefab化します。
Scene上のPlayer GameObjectは削除します。
f:id:napo909:20220109154327p:plain

次に、Scene上に空のGameObjectを作成し、NetworkManagerに名前を変更します。
作成したGameObjectにNetworkManagerコンポーネントをアタッチします。
f:id:napo909:20220109154424p:plain f:id:napo909:20220109154451p:plain

NetworkManagerコンポーネントのNetwork TransportプルダウンメニューからUNetTransportを選択します。
f:id:napo909:20220109154624p:plain

Network Prefabsリストのプラスボタンを押して、先ほど作成したPlayer Prefabを設定します。
また、Player Prefabの箇所にも同様に設定します。
f:id:napo909:20220109154934p:plain f:id:napo909:20220109154821p:plain

HoloLensからネットワーク接続するためのボタンを以前の記事を参考に作成します。
ボタンの配置など設定は下記と同じため参照して実施します。
xr-physics-work-etc.hatenablog.com HoloLens用の接続用ボタンを用意する

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

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()
    {
        networkManager.Shutdown();
    }
}

f:id:napo909:20220109160933p:plain

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

  • InternetClientServer
  • PrivateNetworkClientServer

f:id:napo909:20210711120536p:plain

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

動作確認

PC-HoloLens間で動作確認します。
方法はMLAPIの時と同じです。

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

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

f:id:napo909:20220109163547p:plain

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

f:id:napo909:20220109163824g:plain

ただし、前回と異なりPC側(Client側)の頭位置が動いていませんでした。
※IsOwnerの扱いがMLAPIと異なってる?
この点は後日調査します。