はじめに
HoloLens 2アプリ(Unity)とWEBアプリ間でリアルタイム反映するようなアプリを作るためSignalRを導入しようと思い、Unity側の実装方法を調べました。今回はその方法について共有します。
環境
Visual Studio Professional 2022
Unity 2020.3.36f1
Microsoft.AspNetCore.SignalR.Client 6.0.8
MRTK 2.8.2
前提
- SignalRの使い方を理解していること
- ハブを実装済みであること
以下のチュートリアルが参考になると思います。
learn.microsoft.com
※本記事ではUnity側の実装のみについて書きます
手順
SignalRのDLLのダウンロード
UnityにはNugetパッケージを導入する機能が標準ではありません。
そのためMicrosoft.AspNetCore.SignalR.Client
のDLLを依存関係があるものを含めてダウンロードしておきます。
https://www.nuget.org/packages/Microsoft.AspNetCore.SignalR.Client/6.0.8#readme-body-tab
DLLの一括ダウンロードについては以前記事にしたので参考にしてください。
Unityでの実装
UnityプロジェクトのAssetsフォルダ配下にPlugins
というフォルダを作ります。
このフォルダにSignalRのDLLを配置していきます。必要なDLLの探し方は、以下のページを参考にしました。
blog.xin9le.net ↑「動かすのに必要な dll」のセクションです
必要なDLLは以下の通りでした。
Microsoft.AspNetCore.Connections.Abstractions Microsoft.AspNetCore.Http.Connections.Client Microsoft.AspNetCore.Http.Connections.Common Microsoft.AspNetCore.SignalR.Client.Core Microsoft.AspNetCore.SignalR.Client Microsoft.AspNetCore.SignalR.Common Microsoft.AspNetCore.SignalR.Protocols.Json Microsoft.Bcl.AsyncInterfaces Microsoft.Extensions.DependencyInjection.Abstractions Microsoft.Extensions.DependencyInjection Microsoft.Extensions.Features Microsoft.Extensions.Logging.Abstractions Microsoft.Extensions.Logging Microsoft.Extensions.Options Microsoft.Extensions.Primitives System.Buffers System.Diagnostics.DiagnosticSource System.IO.Pipelines System.Memory System.Runtime.CompilerServices.Unsafe System.Text.Encodings.Web System.Text.Json System.Threading.Channels System.Threading.Tasks.Extensions
あとはコードを書くだけ・・・と言いたいところですが、このままだとUnityエディタ上では動作するのですが、HoloLens 2実機では動作しません。
HoloLens 2で動作させるためにUWP形式でビルドを行うのですが、この時にIL2CPPビルドを行います。この時に実際には使用している型がC++のコードに展開されないのが原因のようです。
詳しくは以下の記事を参照いただければと思います。
blog.xin9le.net ↑「IL2CPP 環境下で利用する」のセクションに書いてあります
これを回避するためにPlugins
フォルダ配下にlink.xml
ファイルを配置します。中身は以下の通りです。
<linker> <assembly fullname="Microsoft.AspNetCore.Connections.Abstractions" preserve="all"/> <assembly fullname="Microsoft.AspNetCore.Http.Features" preserve="all"/> <assembly fullname="Microsoft.AspNetCore.SignalR.Common" preserve="all"/> <assembly fullname="Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocol" preserve="all"/> <assembly fullname="Microsoft.Extensions.DependencyInjection.Abstractions" preserve="all"/> <assembly fullname="Microsoft.Extensions.Options" preserve="all"/> <assembly fullname="Microsoft.Extensions.Primitives" preserve="all"/> <assembly fullname="Microsoft.Bcl.AsyncInterfaces" preserve="all"/> <assembly fullname="Microsoft.AspNetCore.Http.Connections.Client" preserve="all"/> <assembly fullname="Microsoft.AspNetCore.Http.Connections.Common" preserve="all"/> <assembly fullname="Microsoft.AspNetCore.SignalR.Client.Core" preserve="all"/> <assembly fullname="Microsoft.AspNetCore.SignalR.Client" preserve="all"/> <assembly fullname="Microsoft.AspNetCore.SignalR.Protocols.Json" preserve="all"/> <assembly fullname="Microsoft.Extensions.Configuration.Abstractions" preserve="all"/> <assembly fullname="Microsoft.Extensions.Configuration.Binder" preserve="all"/> <assembly fullname="Microsoft.Extensions.Configuration" preserve="all"/> <assembly fullname="Microsoft.Extensions.DependencyInjection" preserve="all"/> <assembly fullname="Microsoft.Extensions.Logging.Abstractions" preserve="all"/> <assembly fullname="Microsoft.Extensions.Logging" preserve="all"/> <assembly fullname="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" preserve="all"/> </linker>
こちらのXMLファイルの書き方は以下の記事を参考にさせていただきました。
以上で準備完了です。
SignalRに接続するためのスクリプトは以下のようにします。
using Microsoft.AspNetCore.SignalR.Client; using UnityEngine; public class SignalR : MonoBehaviour { HubConnection connection; async void Start() { connection = new HubConnectionBuilder() .WithUrl("[SignalRハブのURL]") .Build(); await connection.StartAsync(); Debug.Log(connection.State); } }
このスクリプトを何らかのオブジェクトに追加し、Unityエディタでアプリケーションを起動するとSignalRへの接続が開始され、状態がログに表示されます。
以下の通り接続できました。
HoloLens 2にデプロイして実行しても接続できることが確認できました。
上記のスクリプトではハブへの接続のみでしたが、ハブにメッセージを送信したりハブからメッセージを受信することでリアルタイム通信を行うアプリケーションを作成することができます。
終わりに
以上のようにしてHoloLens 2のアプリでSignalRを実装することができます。チャットなどのアプリを作ることができるのでぜひ試してみてください。