HoloLens(UWP-Unity)で使えない機能と対処法（一部）

# 概要
UnityでHoloLensアプリを開発していて発生した
「ビルドが通らない」とか「PCとなんか動作が違う」などの失敗事例について掲載していました。

ただ、様々な方からアドバイスをいただく機会があり、
「原因や事情、発生するポイント」などの情報が
参考リンクのページを回っていただくと理解できるようになっています。

**注意**
読むべき内容は参考リンクの方にあり、
上半分は検索キーワード代わりに残しているだけで、
あらためて読みやすい文章をまとめたいと思っています。
中途半端な考察などがあるため、鵜呑みにしないでください。



# 動かないと確認したクラスなど
####シリアライザ関連
'Binary' 
'ISerializable' 
'SerializationInfo' 

#### 型情報
'Type'

#### スレッド
'Thread' 
'Thread.Sleep'

#### 通信関連
'SocketFlags'
'Socket' 
'Dns'
'UdpClient' 
(System.Net名前空間がおそらく全滅？）


# UWP系製作の注意

同様の問題に関する知見として,
KCS（Keio Computer Society）さんの所に以下の記事がありました。
[UNITYでUWP(WINDOWS STORE)アプリを作るときに気を付けること
](https://kcs1959.jp/archives/2416/general/unity%E3%81%A7uwp-windows-store%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E6%B0%97%E3%82%92%E4%BB%98%E3%81%91%E3%82%8B%E3%81%93%E3%81%A8)


# HoloLensでUDP通信する

UDP Clientに関しては
[HoloLens で UDP 通信を行う方法について調べてみた - 凹みTips](http://tips.hecomi.com/entry/2017/04/19/011320)
凹先生([@hecomi](https://twitter.com/hecomi))の所に対処方法があります。


なお、こちらで掲載してくださっているコードについて、
まずはHoloLensで動かそうと思って、DatagramSocket周囲だけコピペしたコンポネントを作りましたが、
これもビルドをうまく通りませんでした。

VisualStudioから参照が不十分とかnamespaceが見つからないと出るので、
オブジェクトファインダーで該当するものを探して追加したのですが、
どのバージョンのDLLを取り込んでもビルドできません。

とりあえず動かしたいだけなのに！
という事で、凹先生に質問させていただいたら、
とても丁寧に教えてもらうことができました。
本当にありがとうございます。。。！

### 問題の原因
問題の原因は
「UnityのC#」と「UWPの実機書き出しプロジェクトのC＃」で
**使っているランタイムが違う**のがこうした現象の原因らしいです。
（Unity側のC#ランタイムが古いためDatagramSocketが動かせないらしいです）

### 対処
UWP 向けにビルドすると、C# のランタイムが新しいプロジェクトが生成され、
ここで初めて DatagramSocket を使えるようになりました。
この新しいランタイムに対応していないUnityではもちろん動かないので、動作確認は実機のみになります。
エディタ側のエラーが出た状態だとビルドできないため、
こうしたUWP向けの部分はインタフェースだけ共有して、
実装は `#if UNITY_EDITOR` または `#if NETFX_CORE`を使って、
コンパイル時に切り替える事になるようです。


こうした切り替えを使っての実装についても、
[Unity 向けの OSC 実装を作ってみた - 凹みTips](http://tips.hecomi.com/entry/2017/08/20/193823)
凹先生からこちらの記事を紹介してもらいました。







# 参考リンク

### スライド
**UnityによるHoloLens用UWPアプリケーション開発の勘所**
https://www.slideshare.net/TakahiroMiyaura/unityhololensuwp
このスライド、HoloLens開発を始める前に、とにかく最初に読みたかった。。。！
スライドの作者であるmiyauraさんはほかにもたくさんドキュメントを書かれていて、
qiitaでの記事は「 https://qiita.com/miyaura 」で読ませてもらえます。


### 公式ドキュメント
**Unity や UWP で不足している .NET API | Microsoft Docs**
https://docs.microsoft.com/ja-jp/windows/uwp/gaming/missing-dot-net-apis-in-unity-and-uwp
Unityで不足している.NetのAPIや、
その代替についてなどが細かくまとめられています。
こちらもとりあえず一読しておくと、
HoloLens開発で落とし穴に落ちる回数が大きく減ると思います。

**.NET Core への移植 - ライブラリ | Microsoft Docs**
https://docs.microsoft.com/ja-jp/dotnet/core/porting/libraries
「.NET Core で使用できない .NET Framework テクノロジ」
「コードの移植性を判別する」などのトピックがあり、
UnityでUWPアプリを作る前に一読するとよさそうです。


**dotnet/corefx**
https://github.com/dotnet/corefx/wiki/ApiCompat
Microsoftが公式で提供してくれている
挙動や互換性に関して注意が必要な.NetのAPIリスト

### サンプルリポジトリ
**Microsoft/Windows-universal-samples**
https://github.com/Microsoft/Windows-universal-samples
Microsoftが公式で提供してくれている
UWPのサンプル集です。


### ライブラリプロジェクト
**akihiro0105/HoloLensModule**
https://github.com/akihiro0105/HoloLensModule
HoloLens開発で使いたい手のトラッキングや各種通信、あると便利なユーティリティなどを、
コンパクトにまとめてくださっているプロジェクト。
ありがたや。。。


# 謝辞

参考リンクについては、凹み先生から直接教えていただいたり、
[株式会社ホロラボ｜HoloLab Inc.](http://hololab.co.jp/)に所属されている方々から、Twitterを通じて教えていただいたりしました。
ゆーじさん([@yuujii](https://twitter.com/yuujii))
d_yamaさん([@dy_karous](https://twitter.com/dy_karous))
デコシさん([@Ash_Yin](https://twitter.com/Ash_Yin))
ありがとうございます！！
ほかにも、おすすめのリンクなどがありましたら、コメントなどに残していただけると嬉しいです。

**追記 1(2018/6/6 14:00)** HoloLensでUDP通信する、を追加しました
**追記 2(2018/6/6 19:50)** 参考リンクを追加しました