MLAPIをHoloLensでつかう その2(ユーザの位置共有をしてみる)
今回は前回の続きです。
xr-physics-work-etc.hatenablog.com
今回もMLAPIのチュートリアルに沿いつつやっていきます。
NetworkManagerを設定する
Hierarchy上で空のGameObjectを作成し、NetworkManager
に名前を変更します。
作成したGameObjectにNetworkManager
コンポーネントをアタッチします。
NetworkManager
コンポーネントは名前の通り、共有用の接続を管理しています。
アタッチしたら、NetworkManagerコンポーネントのSelect transport...
からUnetTransport
を選択します。
UNetTransport
を選択すると、UNetTransport
コンポーネントがアタッチされます。
ここに、接続先のIPアドレスや、ポート番号の情報を設定します。
PlayerPrefabを作る
ユーザの位置や操作を伝えるためのPlayerオブジェクトを作成します。
今回はユーザの頭の位置を共有するため、SphereをScene上に作成し、サイズを調整した後NetworkObject
コンポーネントをアタッチします。
名前をPlayerに変更しておきます。
次に、頭の位置を追従するように、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; } }
作成したPlayerオブジェクトをAsset→Prefabsにドラッグ&ドロップしてPrefab化します。
Prefab化したら、Hierarchy上のPlayerオブジェクトを削除します。
Prefabを作成したら、Hierarchy上のNetworkManagerコンポーネントを選択し、NetworkPrefab
にPlayerプレハブを設定します。
今回作成したのはPlayerなので、Default Player Prefab
にチェックを入れます。
HoloLens用の接続用ボタンを用意する
UnityEditorの場合は、InspectorからHostやClientとして接続するボタンがありますが、HoloLensの場合そうはいきません。
簡単に接続用のボタンを用意します。
※接続先IPアドレスなどの設定も今後は必要ですが、今回は割愛。
GridObjectCollection
を用いて4つのボタンを整列して配置します。
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 { // ここには入らない } } }
各ボタンに対応する関数を設定します。
動作確認
プロジェクトをビルドする前に「Build Settings」→「Player Settings」→「Player」→「Publishing Settings」→「Capabilities」から下記にチェックを付けます。
- InternetClientServer
- PrivateNetworkClientServer
その後、ビルドを実施し、HoloLens2にアプリを入れます。
今回は、HoloLens2(Host)⇔PC(UnityEditor, Client)間で確認します。
HoloLens2でアプリを起動したら、自分のIPアドレスを確認します。
(「自分のIP」のボイスコマンドやWi-Fiの詳細情報を確認)
確認したHoloLens2のIPアドレスをPC側のNetworkManagerオブジェクトのUNET Transport
中Connect Address
に設定します。
その後、HoloLens側でConnect Host
、PC側でConnect Client
ボタンを押して接続します。
正しく接続できると、各ユーザの頭の位置が球体で示されます。
HoloLens2をかぶっている頭を動かすと、PC側にも反映されます。
これでMLAPIを用いたHoloLens2でのローカルネットワーク経由の共有が実施できました。
次回は物体の操作を共有します。