個人でHoloLensでシェアリングアプリを作るとき困るんです
もうお察しかもしれませんが、HoloLensでシェアリングのアプリを作るときに最大の問題は「HoloLensが複数台必要になること」です。過去色々方法は模索していたんですが最も有力なものとしてHoloLensエミュレーターを利用する方法です。過去SharingService(Mixed Reality Toolkitが提供するサーバを立てて利用するシェアリングのシステム)の場合ではあるのですが、この方法で複数台のHoloLensでの動きを確認していました。HoloLens実機1台でシェアリングアプリのデバックするには以下の組み合わせで疑似的な2デバイス状態を作る形になると思います。
- HoloLens Emulator&HoloLens実機でシェアリング
- Unity Editorを使ってPC&HoloLens実機でシェアリング
- PCのWindows Mixed Realityデバイス & Hololens実機でシェアリング
この中で特に「2. Unity Editorを使ってPC&HoloLens実機でシェアリング」はデバッグ時の情報も確認できる&手軽に実現できるのでいいと思います。
ということで、今回はMixed Reality Toolkit - Unityのサンプル「SharingWithUNET」をUnity Editorのデバッグ実行で確認したいと思います。
SharingWithUNETはそのままではUnity Editorのデバッグはできない。
実はそういうトラップがあったります。MRTKについているこのサンプルをUnity Editor上で実行してもUNETでいう「ホスト」や「クライアント」になれません。これはUnity Editorの場合は「ホストのIPアドレスがランダム」という実装になっているのでMRTKのサンプルをベースにUNETを使うとデバッグ時に困ります。
ということで少し見直して問題を解消しシェアリングアプリ開発を楽にしましょう。
修正方法
まずは、開発環境ですが以下の形となります。
開発環境
- Windows 10 Pro Spring 2018 Update
- Unity 2017.2.1p2
- HoloToolkit-Unity-2017.4.0.0.unitypackage
- HoloToolkit-Unity-Examples-2017.2.1.4.unitypackage
修正箇所
修正するコードは「NetworkDiscoveryWithAnchor.cs」です。
修正箇所は以下の3個所になります。
- Awakeメソッド
- InitAsServerメソッド
- StartHostingメソッド
Awakeメソッドの修正
AwakeメソッドではUnity Editor上で動かす際にIPアドレスを「"Editor"+ランダム値」で設定します。まずはここを正しいIPアドレスに変更しましょう。
プロパティを用意してもいいのですが、ここは手っ取り早くハードコーディングで。
private void Awake()
{
#if !UNITY_EDITOR && UNITY_WSA
// Find our local IP
foreach (HostName hostName in NetworkInformation.GetHostNames())
{
if (hostName.DisplayName.Split(".".ToCharArray()).Length == 4)
{
Debug.Log("Local IP " + hostName.DisplayName);
LocalIp = hostName.DisplayName;
break;
}
}
#else
LocalIp = "XXX.YYY.ZZZ.XXX";//ここを端末のIPアドレスにする。
#endif
InitAsServerメソッドとStartHostingメソッド
これらのメソッドは実際にホストとしてサービスを立ち上げるために利用するメソッドなのですが、Unity Editorでの実行時は意図的にIPアドレスの指定を行っていません。
これは先ほどのAwakeメソッドでダミーのIPアドレスを与えている空だと思います。
ここはUnity Editorのみで実行が除外されている部分を修正します。
修正箇所は各メソッド最初にある以下の記述から「#if !UNITY_EDITOR && UNITY_WSA」と「#endif」を削除します。
private IEnumerator InitAsServer()
{
Debug.Log("Acting as host");
NetworkManager.singleton.serverBindToIP = true;
NetworkManager.singleton.serverBindAddress = LocalIp;
・
・
}
public void StartHosting(string SessionName)
{
StopListening();
NetworkManager.singleton.serverBindToIP = true;
NetworkManager.singleton.serverBindAddress = LocalIp;
・
・
}
HoloLensにデプロイして実行
アプリが完成したらHoloLensにデプロイします。
その状態からUnity Editorをデバックで実行しホストとして実行します。その後HoloLensで同じアプリを起動するとデバッグ中の端末が一覧に表示されるので、選択して参加することでシェアリングが可能です。