たるこすの日記

たるこすの日記

リアルからバーチャルへ、バーチャルからリアルへ

Unity Editor でも HoloLens でも SignalR を使いたい

はじめに

Unity Editor および HoloLens で SignalR が使えたので、その方法を紹介します。

かずき (@okazuki) さんがブログで SignalR を Windows Mixed Reality で使う方法を紹介されていたのですが、UWP でしか動かないと Unity Editor でデバッグできなくて面倒なので、Unity Editor でも使えるかどうか試してみました。

blog.okazuki.jp

SignalR サーバの実装

先ほどのかずきさんのブログを参考にして ASP.NET MVC で実装しました。

ブログの通りに実装して実行したところ、"ファイルまたはアセンブリ 'Microsoft.Owin'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリマニフェスト定義はアセンブリ参照に一致しません。" というエラーが発生しました。

インストールされていた Owin のバージョンが古かったことが原因で、4.0.0 に更新すると動きました。

NuGet での DLL ダウンロード

はじめに、以下のページから NuGet のコマンドラインツールをダウンロードします。

NuGet Gallery | Downloads

ダウンロードした nuget.exe にパスを通すか、コマンドプロンプトで nuget.exe があるディレクトリに移動した後で、以下のコマンドを実行します。

> nuget install Microsoft.AspNet.SignalR.Client  -OutputDirectory signalr

すると、signalr ディレクトリに SignalR.Client とその依存パッケージ(Newtonsoft.Json) がダウンロードされます。

Microsoft.AspNet.SignalR.Client.2.2.3 ディレクトリには lib フォルダがあり、その中にプラットフォーム別の DLL が入っています。

Unity への DLL のインポート

Unity 2017 ではデフォルトの .NET のバージョンが .NET 3.5 なのですが、SignalR.Client は .NET 3.5 で使えるものがなかったので、Unity の .NET のバージョンを上げる必要があります。

Player Settings の Other Settings 欄の Scripting Runtime Version を Experimental (.NET 4.6 Equivalent) に変更することで、.NET 4.6 までの DLL が使えるようになります。

次に、Assets 内に Plugins フォルダを作成し、その中に WSA フォルダを作成します。Plugins フォルダは Assets 直下じゃなくても大丈夫です。

Plugins フォルダ内に、Microsoft.AspNet.SignalR.Client.2.2.3\lib\net45\Microsoft.AspNet.SignalR.Client.dllNewtonsoft.Json.6.0.4\lib\net35\Newtonsoft.Json.dll をインポートします。また、両方とも Inspector で Any Platform のチェックを外し、Include Platforms の WSAPlayer のチェックを外します。これで、この DLL は Unity Editor 上では使われますが、UWP では使われなくなります。

次は、UWP 用の DLL をインポートします。
WSA フォルダに Microsoft.AspNet.SignalR.Client.2.2.\lib\netcore50\Microsoft.AspNet.SignalR.Client.dllNewtonsoft.Json.6.0.4\lib\netcore45\Newtonsoft.Json.dll をインポートします。 こちらの DLL には、WSAPPlayer のみチェックが入るようにします。

スクリプトの実装

かずきさんのブログの SignalRManager.cs を作成し、適当な GameObject にアタッチします。ただし、スクリプト内の

#if UNITY_UWP
#endif

は削除します。

これで、Unity Editor 上でも、UWP (HoloLens) でも SignalR が使えるようになりました。