Netcode for GameObjects (旧MLAPI)をHoloLensで使ってみる その1
今回は、Unity公式の共有フレームワークのNetcode for GameObjectsを触ってみます。
元になった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アプリ向けの設定は下記を参考にできます。
Netcode for GameObjectsを導入する
公式のチュートリアルを元に実施します。
上部メニューのWindow→Pacakge ManagerからPackage Managerウィンドウを表示します。
Pakcage Managerウィンドウ左上の+ボタンを押して、Add package from git URL...
を選択します。
出てくるInputFieldに下記文字列を入力してAddボタンを押します。
com.unity.netcode.gameobjects
正常に読み込まれると、リストにNetcode for GameObjectsが追加されます。
Packageを見てNetcode for GameObjectsフォルダが存在すれば正しく取り込まれています。
お試し実装
チュートリアルのHello Worldをベースに、お試しで実装してみます。
まずはユーザを示すPrefabを作成します。
Scene上にSphereを追加し、NetworkObject
コンポーネントをアタッチします。
方向がわかるようにz方向のScaleを変更しておきます。
次に、ユーザ頭位置を示すように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; } }
作成したGameObjectをPlayer
に名称を変更し、Assets中にドラッグ&ドロップしてPrefab化します。
Scene上のPlayer GameObjectは削除します。
次に、Scene上に空のGameObjectを作成し、NetworkManager
に名前を変更します。
作成したGameObjectにNetworkManagerコンポーネントをアタッチします。
NetworkManager
コンポーネントのNetwork TransportプルダウンメニューからUNetTransportを選択します。
Network Prefabsリストのプラスボタンを押して、先ほど作成したPlayer
Prefabを設定します。
また、Player Prefabの箇所にも同様に設定します。
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(); } }
プロジェクトをビルドする前に「Build Settings」→「Player Settings」→「Player」→「Publishing Settings」→「Capabilities」から下記にチェックを付けます。
- InternetClientServer
- PrivateNetworkClientServer
その後、ビルドを実施し、HoloLens2にアプリを入れます。
動作確認
PC-HoloLens間で動作確認します。
方法はMLAPIの時と同じです。
HoloLens2でアプリを起動したら、自分のIPアドレスを確認します。 (「自分のIP」のボイスコマンドやWi-Fiの詳細情報を確認)
確認したHoloLens2のIPアドレスをPC側のNetworkManagerオブジェクトのUNET Transport
中Connect Address
に設定します。
その後、HoloLens側でConnect As Host
、PC側でConnect As Client
ボタンを押して接続します。
正しく接続できると、各ユーザの頭の位置が球体で示されます。
HoloLens2をかぶっている頭を動かすと、PC側にも反映されます。
ただし、前回と異なりPC側(Client側)の頭位置が動いていませんでした。
※IsOwnerの扱いがMLAPIと異なってる?
この点は後日調査します。