Unity Editor でも HoloLens でも SignalR を使いたい
はじめに
Unity Editor および HoloLens で SignalR が使えたので、その方法を紹介します。
かずき (@okazuki) さんがブログで SignalR を Windows Mixed Reality で使う方法を紹介されていたのですが、UWP でしか動かないと Unity Editor でデバッグできなくて面倒なので、Unity Editor でも使えるかどうか試してみました。
SignalR サーバの実装
先ほどのかずきさんのブログを参考にして ASP.NET MVC で実装しました。
ブログの通りに実装して実行したところ、"ファイルまたはアセンブリ 'Microsoft.Owin'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。" というエラーが発生しました。
インストールされていた Owin のバージョンが古かったことが原因で、4.0.0 に更新すると動きました。
NuGet での DLL ダウンロード
はじめに、以下のページから NuGet のコマンドラインツールをダウンロードします。
ダウンロードした 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.dll
と Newtonsoft.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.dll
と
Newtonsoft.Json.6.0.4\lib\netcore45\Newtonsoft.Json.dll
をインポートします。
こちらの DLL には、WSAPPlayer のみチェックが入るようにします。
スクリプトの実装
かずきさんのブログの SignalRManager.cs を作成し、適当な GameObject にアタッチします。ただし、スクリプト内の
#if UNITY_UWP
#endif
は削除します。
これで、Unity Editor 上でも、UWP (HoloLens) でも SignalR が使えるようになりました。
SignalR を使ってオブジェクト生成 pic.twitter.com/kP7KUWum1s
— たるこす (@tarukosu) 2018年4月27日