HololensでSharingするアプリケーションをスタンドアロンで検証する（エミュレータ+実機版）

# Hololens1台とエミュレータを同一空間内で動作させてSharingアプリケーションを試すには
以前書いた[HololensでSharingするアプリケーションをスタンドアロンで検証する（エミュレータのみ版）](http://qiita.com/miyaura/items/720c16fd93aa9a521073)ではエミュレータ2台でSharingのアプリケーションを試すことはできました。今回は実機+エミュレータの組み合わせでSharingのアプリケーションを試してみました。
## 環境

今回記載している内容については以下の環境での話になります。
なお、Hololens実機とエミュレータを動作させる端末、SharingServiceはすべてネットワーク上でつながっていることが前提となります。
今回は[前回](http://qiita.com/miyaura/items/720c16fd93aa9a521073)と同様端末１台でエミュレータとSharingServiceを稼働させ、Hololens実機で検証しました。

### お題となるアプリ

- [holograms_240](https://developer.microsoft.com/en-us/windows/holographic/holograms_240)

サイトに行くとZipファイルで圧縮されたものが手に入ります。GitHubからは「[https://github.com/Microsoft/HolographicAcademy/](https://github.com/Microsoft/HolographicAcademy/)」

### 必要なアプリ

必要なアプリなどは[前回](http://qiita.com/miyaura/items/720c16fd93aa9a521073)と同じです。これにHololens実機が必要になります。

- Windows 10 Pro(Hyper-V機能の有効化必須)
- Visual Studio 2015 Community Edition update 3
- Unity 5.5.0P2 Personal
- Hololens Emulator 10.0.14393.0

## 実施手順
ほとんどの手順はエミュレータ２台の[前回](http://qiita.com/miyaura/items/720c16fd93aa9a521073)を同じ作業になります。大きく異なる点は「Hololens実機の空間情報をエミュレータ側に登録する。」です。実際には空間情報が一致していなくてもアプリは動作しますが、空間情報が合わないため[holograms_240](https://developer.microsoft.com/en-us/windows/holographic/holograms_240)のような弾が実空間の物体で反射したりするアプリだとうまく反射しないなどはあります。

1.エミュレータの準備&amp;IPアドレスのチェック
2.SharingServiceの動作確認&amp;IPアドレスのチェック
3.<font color="Crimson">holograms_240の修正</font>
4.[holograms_240](https://developer.microsoft.com/en-us/windows/holographic/holograms_240)のビルドとパッケージ化
5.<font color="Crimson">アプリケーションのデプロイ(エミュレータと実機）</font>
6.<font color="Crimson">空間情報の展開</font>
7.実行

### 1.エミュレータの準備&amp;IPアドレスのチェック
[前回の1.エミュレータの準備&amp;IPアドレスのチェック](http://qiita.com/miyaura/items/720c16fd93aa9a521073#1%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%AE%E6%BA%96%E5%82%99ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF)と手順は同じです。
### 2.SharingServiceの動作確認&amp;IPアドレスのチェック
[前回の2.SharingServiceの動作確認&amp;IPアドレスのチェック](http://qiita.com/miyaura/items/720c16fd93aa9a521073#2sharingservice%E3%81%AE%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8Dip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF)と手順は同じです。
実は前回気づいてなかったのですが、SharingServiceの仕様として「サービスを立ち上げた端末のネットワークアダプタ全て」に対してポートを公開するようです。このためエミュレータ用のネットワークアダプタと、端末が外部とつながっている無線のネットワークアダプタ両方とも同じサーバを参照できます。おかげでネットワークの構成を難しく考えなくても簡単にエミュレータと実機接続ができました。

![s3.png](https://qiita-image-store.s3.amazonaws.com/0/152548/be9b3287-13f1-46bd-b303-c5f76351277a.png)

これは今回の環境なのですが、172.16.80.1がエミュレータで使っている仮想環境用のアダプタのネットワークで、192.168.0.9が端末の無線LANアダプタのネットワークになります。

### 3.[holograms_240](https://developer.microsoft.com/en-us/windows/holographic/holograms_240)の修正
[前回の3.holograms_240の修正](http://qiita.com/miyaura/items/720c16fd93aa9a521073#3holograms_240%E3%81%AE%E4%BF%AE%E6%AD%A3)と手順は同じですがエミュレータ用と実機用の2プロジェクト分ビルドしました。ちゃんとコーディングしてサーバのアドレスをあとから可変にすればいいだけなのですが、今回はやっていません。
先の手順でひかえておいたエミュレータ用、実機用それぞれサーバアドレスを設定してUnityからビルドを行います。


### 4.[holograms_240](https://developer.microsoft.com/en-us/windows/holographic/holograms_240)のビルドとパッケージ化
[前回の4.holograms_240のビルドとパッケージ化](http://qiita.com/miyaura/items/720c16fd93aa9a521073#4holograms_240%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E3%81%A8%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E5%8C%96)と同じ手順でエミュレータ用、実機用のパッケージを作成します。
### 5.アプリケーションのデプロイ
[前回の5.アプリケーションのデプロイ](http://qiita.com/miyaura/items/720c16fd93aa9a521073#5%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)と同じです。実機へのデプロイはVisual Studioから「Release」-「X86」-「Device」の設定で配置するほうが早いと思います。
### 6.空間情報の展開
おそらく空間情報を共有しなくてもアプリ自体は動くはずですが、お題アプリみたいに「弾が壁に反射する」ような現実世界との作用を考慮したアプリであれば空間情報を共有する必要もあると思います。
今回は空間情報そろえてみました。
#### 6-1.現実データの採取
エミュレータの投入するためにHololens実機で空間情報をとります。単純に部屋の中をうろうろして部屋の情報をとるだけです。見回す&amp;クリックしたおしてください。

#### 6-2.Hololensから空間情報をエクスポート
Device Potalからデータをエクスポートできます。
HololensをUSBでPCにつなぎDevice Potalをひらきます。（Device Potalを使うための設定は[こちら](http://qiita.com/miyaura/items/0f4cedb30101ab6a952b#hololens%E3%81%A7%E3%81%AE%E5%8B%95%E3%81%8D%E3%82%92%E5%85%B1%E6%9C%89%E3%81%97%E3%81%9F%E3%81%84%E3%81%AA%E3%81%A9))
![s20.jpg](https://qiita-image-store.s3.amazonaws.com/0/152548/bd2a2a59-aea5-5645-ca09-97a591a7c253.jpeg)
Device Potalの「Simulation」を選択し「Capture room」から空間情報を取り出せます。
「Room Name」ですが、一応Hololens側の空間名（Space X）にして取り出しました。
「Room Name」を入力しCaptureを押すとダウンロードされます。
空間名についてはHololens実機の「System」-「Spaces」から確認できます。
ただ、実際にはActiveのデータをエクスポートしていると思います。あくまでファイル名なんじゃないのかなと思います。

#### 6-3.エミュレータへの投入
実機から取り出した空間情報をエミュレータに投入します。
エミュレータの「Tools」を選択し設定画面を開き「Room」タグを選択します。
「Load Room」を押して先の実機からエクスポートしたファイルを選択するとデータがロードされます。

![s22.jpg](https://qiita-image-store.s3.amazonaws.com/0/152548/92ad6b7c-3fa6-5aec-7b36-6434c294b027.jpeg)

### 7.実行
SharingServiceを立ち上げ、それぞれのエミュレータ、実機からアプリケーションを起動すれば、
同じ空間でアプリが動きます。

![20170218_104604_HoloLens.jpg](https://qiita-image-store.s3.amazonaws.com/0/152548/7cb916a2-a4ab-e5b2-5b1e-4a40dd057cb5.jpeg)

Hololensのスクリーンショットですが、ちゃんと実機側からエミュレータ２台分の機体、エミュレータ上にほかの機体が見えていて撃ち合いができました。