gRPCのUnity開発環境 (for .NET Framework 4.5) を整える
Tags: unity3d, grpc
Published: 2020-08-19 16:19:58

***
# はじめに
こんにちは、今年に入ってUnityエンジニアとして活動を始めました、じぇしかです。最近VRコンテンツのバックエンドに興味が湧いており、プロトコルを主軸にいろいろと調べていたりします。その中でもHTTP/2をベースとしたgRPCが個人的にアツい技術だと感じ始めており、VRコンテンツの通信においても、将来的にデファクトスタンダードになるんじゃないかと思っています。

まずはUnityクライアントとして動作する環境を構築しよう、ということで調べながら構築してみたのですが、2020/08/20時点、導入方法の記事はいくつかあるものの、最近のバージョンだと下記のようなエラーを引いてしまいます。
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ux8kjeq1xg3n1yvv5psr.png)

いろいろと調べてもこの話題はあまり見つからなかったのですが、この事象の原因と解決方法をどうにか見つけられたので、それも踏まえてgRPC環境の構築手順を記載します。なお、ここでは公式で提供されている開発中の最新版ライブラリを使用します。安定版を使用したい、もしくは.NET Standard 2.0に準拠する必要がある場合は、NuGetを使用した方法で対応できますので、別の記事として改めて紹介します。

***
# 手順
## 環境
今回検証している環境を記載します。
OS: Windows10
Unity: 2019.4.8f1 (.NET Framework 4.*)

## Api Compatibility Levelの変更
タイトルの通り、公式で提供している最新版が.NET Framework 4.5をターゲットにしているため、それに合わせましょう。Unityにて[Edit] > [Project Settings...]タブを順に選び、開きます。その中の[Player]セクション、さらに[Other Settings]の中に[Api Compatibility Level] の項目があるので、それを".NET 4.x"に設定してください。これで、ターゲットのフレームワークが.NET Framework 4.xとなります。
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/slucl47x5uikfrs3pco7.png)

## gRPC関連ライブラリのダウンロードとインポート
次に、gRPCが公式で配布しているパッケージを取得します。下記リンク先から最新のビルド (一番上にあるBuild ID) を選択します。
https://packages.grpc.io/

ページ移動したら、C#カテゴリの一番上、"grpc_unity_package.*.*.*-dev.zip"というパッケージがあるので、それをダウンロード、展開しましょう。今回の場合は、"grpc_unity_package.2.32.0-dev.zip"でした。
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/klu13kn39bremvulyifm.png)

ダウンロードしたパッケージを展開すると、直下にPluginsフォルダがあります。これをUnityプロジェクトの"Assets"フォルダ配下に配置してください。Pluginsフォルダの中には、Grpcに必要なパッケージ群が収められています。
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/5040jlhldulmpdzty23i.png)

## gRPC関連ライブラリの引っ越し
さて、ここまでは調べると出てくるような既存の記事と同様の手順です。しかし、ここであまり触れられていないエラーが発生します。依存ライブラリとしてSystem.Memoryもインストールされているのですが、シーンを再生すると冒頭に出てきたSystem.Memoryを参照できないというエラーが出力されます。
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ux8kjeq1xg3n1yvv5psr.png)

詳細はわからないのですが、どうやら下記の不具合 (仕様？)に引っかかっているようで、DLLがお互いに上手く参照ができていないためと思われます。そこで、これらのライブラリをすべて同じフォルダに移動させる対応を行います。
[Editor assembly loading issues - "unloading broken assembly", "could not load signature"](https://forum.unity.com/threads/editor-assembly-loading-issues-unloading-broken-assembly-could-not-load-signature.754508/)

それでは、ライブラリを移動させるフォルダを作成します。特に制限はないのですが、今回は"Assets/Plugins/Assemblies/Grpc/lib/net4.5"としました。このフォルダ直下に、各ライブラリの"lib/net4.5"フォルダ直下にあるファイルを配置していきます。移動させたらフォルダを削除して構いませんが、Grpc.Coreについてはruntimesフォルダを含んでいるので、そのまま残しておきます。移動が完了すると、以下のような状態になるかと思います。
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/1akclglf3f0p4rsp4lxy.png)

この時点で参照が解決され、再度シーンを実行すると冒頭のエラーが出力されなくなります。念の為にテスト用のスクリプトを作成し、今回導入したパッケージを参照できるか確認しておきましょう。エディターのオートコンプリートなどで確認するとよいかと思います。
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/nd6wimo8mj9oop5z3sn5.png)

***
# おわりに
以上の手順で、Unity上にgRPCの開発環境をざっくり構築できました。手順自体は単純なのですが、冒頭のエラーは言及されている情報が見つかりにくく、ドはまりポイントだったりします。この記事が、少しでも手助けになればと思います。

また今回ダウンロードしたライブラリ群ですが、安定版はNuGet Galleryにて配布されています。というか、実際に使用する場合はそちらからライブラリを集めて導入すべきなのではないか、と思っていたりします。とはいえ、一方でUnityにDLLを導入する手順も意外と見つかりません。後日に別の記事として、NuGetを使用した導入方法もご紹介いたします。

# 参考
[【Unity】NuGetからパッケージをダウンロード～Unityに導入までの流れをまとめてみた - はなちるのマイノート](https://www.hanachiru-blog.com/entry/2019/07/07/233000)
[gRPCとProtocol Buffersによるアプリケーション間通信 / Unity｜npaka｜note](https://note.com/npaka/n/n050b1aba7772#GXV7V)
[UnityでgRPCを動かす](https://qiita.com/rookx/items/a902f725893d37f0f464)