UnityでSignalRを使ったHoloLens 2アプリを作る

はじめに

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

  • ハブを実装済みであること
    以下のチュートリアルが参考になると思います。
    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の一括ダウンロードについては以前記事にしたので参考にしてください。

blog.jbs.co.jp

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++のコードに展開されないのが原因のようです。
詳しくは以下の記事を参照いただければと思います。

docs.microsoft.com

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ファイルの書き方は以下の記事を参考にさせていただきました。

bluebirdofoz.hatenablog.com

以上で準備完了です。

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を実装することができます。チャットなどのアプリを作ることができるのでぜひ試してみてください。

執筆担当者プロフィール
古川 貴浩

古川 貴浩(日本ビジネスシステムズ株式会社)

HoloLens 2アプリケーションの開発をしています。

担当記事一覧