ブログ@HoloLabInc

株式会社ホロラボのブログです

Unity Editor でも HoloLens でも、 MRTK と SignalR を使いたい

はじめに

かずきさんとたるこすさんがHoloLensやWindows MRなどのUWP環境とUnityエディターでSignalRクライアントを使う方法をまとめてくれています。

blog.okazuki.jp

tarukosu.hatenablog.com

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のコード一式は公開されているので、これをビルドします。

github.com

結果

Unityエディター、UWPビルドともに動作していることがわかります(UWP版はマテリアルはがれてるのはご愛敬)。エディター用の.NET DLLとUWP用のDLLを両方入れているので、どちらの環境でも同じように動作します(サーバーはかずきさんが公開しているものを使用しています)。

f:id:kaorun55:20180615232507g:plain f:id:kaorun55:20180615232100g:plain

SignalR.Clientのビルド

GitHubからコードをダウンロードして、プロジェクトを開きます。今回、エディター用DLLは「Microsoft.AspNet.SignalR.Client45」をUWP用DLLは「Microsoft.AspNet.SignalR.Client.UWP」を使用しています。

それぞれのプロジェクトの「参照」メニューからNuGetパッケージの更新を行います。このとき、Newtonsoft.Json.dllの該当バージョンの10.0.3を指定します。パッケージを更新したらビルドを行います。正常にビルドができればOKです。

f:id:kaorun55:20180615234004p:plain

おまけ

エラー画像

Newtonsoft.Json.dllのバージョン

下記がVisual StudioのNuGetで取得したSignalR.Clientが参照しているNewtonsoft.Json.dllのバージョン(6.0.4)。

f:id:kaorun55:20180615233325p:plain

下記がMRTKで使われているNewtonsoft.Json.dllのバージョン(10.0.3)。

f:id:kaorun55:20180615233341p:plain

Newtonsoft.Json.dllのバージョンを削除した場合の動作

どちらかを削除してもお互いのバージョンエラーでビルドができません。 f:id:kaorun55:20180615233533p:plain f:id:kaorun55:20180615233536p:plain