はじめに
かずきさんとたるこすさんがHoloLensやWindows MRなどのUWP環境とUnityエディターでSignalRクライアントを使う方法をまとめてくれています。
SignalRクライアント単体であればこの方法で動くのですが、MRTKを入れるとビルドエラーが発生します。このエントリではその解決方法について書きます。
なお、以下の方法はSignalR.Clientを自分でビルドしているため、自己責任にて使用してください。ビルドしたファイルは下記にあります。
問題点
SignalRクライアントとMRTKを同時にプロジェクトに入れた場合、それぞれがNewtonsoft.Json.dllを参照しています。しかし、Microsoft.AspNet.SignalR.Client.dllが使用しているNewtonsoft.Json.dllのバージョンが古い(6.0.4)ため、MRTKのNewtonsoft.Json.dllのバージョン(10.0.3)と競合します。これによってUnityエディター上でビルドできない問題が発生します。
どちらかを削除してもお互いのバージョンエラーでビルドができません。
MRTKでNewtonsoft.Json.dllを参照しているのはGLTFのライブラリなので、GLTFフォルダごと削除してみましたが、Immersive用のコントローラーモデルがGLTFを利用しているようでInput系でエラーが出始めました。このため、MRTK側で調整するのも現実的ではありませんでした。
Visual Studioの場合configファイルでバージョンのリダイレクトを行いますが、Unityエディターの場合の方法がわからない(これで解決できるなら一番いいかもしれません)ため、なんとかMicrosoft.AspNet.SignalR.Client.dllの参照しているDLLのバージョンを変更します。
幸いSignalRのコード一式は公開されているので、これをビルドします。
結果
Unityエディター、UWPビルドともに動作していることがわかります(UWP版はマテリアルはがれてるのはご愛敬)。エディター用の.NET DLLとUWP用のDLLを両方入れているので、どちらの環境でも同じように動作します(サーバーはかずきさんが公開しているものを使用しています)。
SignalR.Clientのビルド
GitHubからコードをダウンロードして、プロジェクトを開きます。今回、エディター用DLLは「Microsoft.AspNet.SignalR.Client45」をUWP用DLLは「Microsoft.AspNet.SignalR.Client.UWP」を使用しています。
それぞれのプロジェクトの「参照」メニューからNuGetパッケージの更新を行います。このとき、Newtonsoft.Json.dllの該当バージョンの10.0.3を指定します。パッケージを更新したらビルドを行います。正常にビルドができればOKです。
おまけ
エラー画像
Newtonsoft.Json.dllのバージョン
下記がVisual StudioのNuGetで取得したSignalR.Clientが参照しているNewtonsoft.Json.dllのバージョン(6.0.4)。
下記がMRTKで使われているNewtonsoft.Json.dllのバージョン(10.0.3)。
Newtonsoft.Json.dllのバージョンを削除した場合の動作
どちらかを削除してもお互いのバージョンエラーでビルドができません。