<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: じぇしか / Jessica</title>
    <description>The latest articles on DEV Community by じぇしか / Jessica (@jscmla1118).</description>
    <link>https://dev.to/jscmla1118</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F447764%2F1d2d57ac-774e-4613-951f-06e18e03e181.jpg</url>
      <title>DEV Community: じぇしか / Jessica</title>
      <link>https://dev.to/jscmla1118</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jscmla1118"/>
    <language>en</language>
    <item>
      <title>Unity上でGoogle.ProtobufがSystem.Memoryを参照できなかったときの対応</title>
      <dc:creator>じぇしか / Jessica</dc:creator>
      <pubDate>Thu, 20 Aug 2020 04:13:46 +0000</pubDate>
      <link>https://dev.to/jscmla1118/unity-google-protobuf-system-memory-m1d</link>
      <guid>https://dev.to/jscmla1118/unity-google-protobuf-system-memory-m1d</guid>
      <description>&lt;h1&gt;
  
  
  はじめに
&lt;/h1&gt;

&lt;p&gt;こんばんは、じぇしかです。最近、習作としてUnityをベースにしたVRプラットフォームを作ってみたいなーと思っている今日この頃なのですが、HTTP/2ベースでオーバーヘッドの少ないgRPCをリアルタイム通信のプロトコルとして使用したいと思っています。&lt;/p&gt;

&lt;p&gt;ということで既存の記事を参考にUnityにgRPCの開発環境を導入していたのですが、Grpc.Core ver.2.23.0以降、下記のエラーが発生してしまうようです。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L8WKQi9C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5m5yabfvlo57aat6oa99.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L8WKQi9C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5m5yabfvlo57aat6oa99.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;「最近の記事はどう解決しているんだ？」と思ったのですが、使用するGrpc.Coreのバージョンを下げていたり、偶然にも回避できていたりで、この事象に対して明確に触れている情報はほとんど見つかりませんでした。いろいろ試した結果、明確ではないのですが事象の発生条件と解決策が見えてきたので、記述しておきます。&lt;/p&gt;




&lt;h1&gt;
  
  
  事象の発生条件
&lt;/h1&gt;

&lt;p&gt;まず、事象が発生する状態を示します。環境整備の手順は他の記事を参照してもらえればよいのですが、導入作業を進めると基本的には下記のようなフォルダ構造になるかと思います。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2SgodMGK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zg26yrajnqw9oq3fl8yi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2SgodMGK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zg26yrajnqw9oq3fl8yi.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ここでシーンを再生すると、冒頭の事象が発生します。メッセージを読むと、ざっくり「Google.ProtobufがSystem.Memoryを読み込むことができなかった」というような旨のようです。とはいうものの、依存パッケージとして指定されていることもあり、System.Memoryも同じくダウンロードして配置はしています。&lt;/p&gt;

&lt;p&gt;ここで私はドはまりして全く進められなかったのですが、いろいろと調べていくうちに、公式フォーラムのとある記事にたどり着きました。&lt;br&gt;
&lt;a href="https://forum.unity.com/threads/editor-assembly-loading-issues-unloading-broken-assembly-could-not-load-signature.754508/"&gt;Editor assembly loading issues - "unloading broken assembly", "could not load signature"&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google.Protobufではないものの、同様にSystem.Memoryの参照が上手くできていないようです。同時に、全てのライブラリ (*.dll) を同じフォルダに入れたところ、エラーが解消されているとも書かれています。やや言い争い状態になっているもののUnityのバグではなく、一部のライブラリにおいて依存関係がハードコードされているようで、フォルダが異なると参照ができないようです。&lt;/p&gt;

&lt;p&gt;ちなみにこの事象、System.Memoryがver.4.5.2以下であれば何故か発生しません。実はGoogle.Protobufが依存しているSystem.Memoryのバージョンもver.4.5.2以降ではあるのですが、Grpc.Coreがver.2.23.0-pre以降のバージョンでSystem.Memory ver.4.5.3以降に依存するようになったため、このver.4.5.3が必要になっています。その結果として、Google.ProtobufがSystem.Memory ver.4.5.3を参照できなくなり、本事象が発生するようになったようです。&lt;/p&gt;




&lt;h1&gt;
  
  
  解決策と対応
&lt;/h1&gt;

&lt;p&gt;さて、明確ではないものの原因らしきものが見えてきたところで、エラーを解決させましょう。結論から言うと、"Google.Protobuf.dll"と"System.Memory.dll"を同じフォルダに入れてあげることで、エラーは解消しました。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qv8-CwyJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bsru5pnheb76prggqqer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qv8-CwyJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bsru5pnheb76prggqqer.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;上記のように、例えば "Assets/Plugins/Assemblies/lib/net4.5" というような名前のフォルダを作って纏めると管理しやすいかと思います。今回は全部同じフォルダに入れていますが、全てのライブラリが依存関係を解決できていないわけではないので、部分的な対応でも大丈夫です。&lt;/p&gt;

&lt;p&gt;念の為、テスト用のスクリプトを作成し、今回導入したパッケージを参照できるか確認しておきましょう。エディターのオートコンプリートで表示されるようであれば、適切に参照できていると判断できます。ひとつ注意事項ですが、プロジェクトの読込みができていない状態だとオートコンプリートも出てこないので、Unity上部のメニュー[Assets] &amp;gt; [Open C# Project]でスクリプトを開くようにしてください。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dVCt-Orz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5d0x1syqldcosu281qfm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dVCt-Orz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5d0x1syqldcosu281qfm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  おわりに
&lt;/h1&gt;

&lt;p&gt;以上、Unity上でgRPC環境を構築するときに私がドはまりした事象について、説明しました。成り行きでGrpc.Coreのバージョンを下げたり、Google.Protobufだけ差し替えてみたりと、この事象に触れている記事がほとんど見つからずとても苦労しました。同じような地雷を踏んでしまったときに、助け船として参照してもらえればと思います。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>gRPCのUnity開発環境 (for .NET Framework 4.5) を整える</title>
      <dc:creator>じぇしか / Jessica</dc:creator>
      <pubDate>Wed, 19 Aug 2020 16:19:58 +0000</pubDate>
      <link>https://dev.to/jscmla1118/grpc-unity-for-net-framework-4-5-h0f</link>
      <guid>https://dev.to/jscmla1118/grpc-unity-for-net-framework-4-5-h0f</guid>
      <description>

&lt;h1&gt;
  
  
  はじめに
&lt;/h1&gt;

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

&lt;p&gt;まずはUnityクライアントとして動作する環境を構築しよう、ということで調べながら構築してみたのですが、2020/08/20時点、導入方法の記事はいくつかあるものの、最近のバージョンだと下記のようなエラーを引いてしまいます。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fux8kjeq1xg3n1yvv5psr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fux8kjeq1xg3n1yvv5psr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

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




&lt;h1&gt;
  
  
  手順
&lt;/h1&gt;

&lt;h2&gt;
  
  
  環境
&lt;/h2&gt;

&lt;p&gt;今回検証している環境を記載します。&lt;br&gt;
OS: Windows10&lt;br&gt;
Unity: 2019.4.8f1 (.NET Framework 4.*)&lt;/p&gt;

&lt;h2&gt;
  
  
  Api Compatibility Levelの変更
&lt;/h2&gt;

&lt;p&gt;タイトルの通り、公式で提供している最新版が.NET Framework 4.5をターゲットにしているため、それに合わせましょう。Unityにて[Edit] &amp;gt; [Project Settings...]タブを順に選び、開きます。その中の[Player]セクション、さらに[Other Settings]の中に[Api Compatibility Level] の項目があるので、それを".NET 4.x"に設定してください。これで、ターゲットのフレームワークが.NET Framework 4.xとなります。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fslucl47x5uikfrs3pco7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fslucl47x5uikfrs3pco7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  gRPC関連ライブラリのダウンロードとインポート
&lt;/h2&gt;

&lt;p&gt;次に、gRPCが公式で配布しているパッケージを取得します。下記リンク先から最新のビルド (一番上にあるBuild ID) を選択します。&lt;br&gt;
&lt;a href="https://packages.grpc.io/" rel="noopener noreferrer"&gt;https://packages.grpc.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ページ移動したら、C#カテゴリの一番上、"grpc_unity_package.&lt;em&gt;.&lt;/em&gt;.*-dev.zip"というパッケージがあるので、それをダウンロード、展開しましょう。今回の場合は、"grpc_unity_package.2.32.0-dev.zip"でした。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fklu13kn39bremvulyifm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fklu13kn39bremvulyifm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ダウンロードしたパッケージを展開すると、直下にPluginsフォルダがあります。これをUnityプロジェクトの"Assets"フォルダ配下に配置してください。Pluginsフォルダの中には、Grpcに必要なパッケージ群が収められています。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5040jlhldulmpdzty23i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5040jlhldulmpdzty23i.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  gRPC関連ライブラリの引っ越し
&lt;/h2&gt;

&lt;p&gt;さて、ここまでは調べると出てくるような既存の記事と同様の手順です。しかし、ここであまり触れられていないエラーが発生します。依存ライブラリとしてSystem.Memoryもインストールされているのですが、シーンを再生すると冒頭に出てきたSystem.Memoryを参照できないというエラーが出力されます。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fux8kjeq1xg3n1yvv5psr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fux8kjeq1xg3n1yvv5psr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;それでは、ライブラリを移動させるフォルダを作成します。特に制限はないのですが、今回は"Assets/Plugins/Assemblies/Grpc/lib/net4.5"としました。このフォルダ直下に、各ライブラリの"lib/net4.5"フォルダ直下にあるファイルを配置していきます。移動させたらフォルダを削除して構いませんが、Grpc.Coreについてはruntimesフォルダを含んでいるので、そのまま残しておきます。移動が完了すると、以下のような状態になるかと思います。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1akclglf3f0p4rsp4lxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1akclglf3f0p4rsp4lxy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;この時点で参照が解決され、再度シーンを実行すると冒頭のエラーが出力されなくなります。念の為にテスト用のスクリプトを作成し、今回導入したパッケージを参照できるか確認しておきましょう。エディターのオートコンプリートなどで確認するとよいかと思います。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnd6wimo8mj9oop5z3sn5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnd6wimo8mj9oop5z3sn5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  おわりに
&lt;/h1&gt;

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

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

&lt;h1&gt;
  
  
  参考
&lt;/h1&gt;

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

</description>
      <category>unity3d</category>
      <category>grpc</category>
    </item>
  </channel>
</rss>
