Unity AndroidでSignalRを導入してソケット通信する
前回CosmosDB+SignalR+Azure Functionsでサーバーレスなリアルタイム通信バックエンドシステムを構築した
今回はそれをUnityで使いたい
基本的にこちらを参考にしている
やはりnuget-cliを使ってNuGetパッケージをダウンロードして、
nuget install Microsoft.AspNetCore.SignalR.Client
をやっていく
ここでフォルダをちゃんと切り替えておくこと
自分はUnityのルートに./External
の中に展開した
じんぐるさんの言うとおりに、
とりあえずdll入れてみて、足りなかったら追加して、を繰り返した結果
こんな感じに
dllは全部パッケージ名/netstandard2.0のものを使用
一応signalrの接続確立はできた
しかしなぜかデータを受け取れない......もしかして構造化されたデータは無理だったり......?
やはり構造化しないで配列で渡してOn<float, float, float>("message", (x,y,z)=>{/*something*/})
の形式で受け取ると無事通リが来た
今更だけどテスト環境を明記する
色々事情があってプロジェクトを開発しながらなのでちょっとだけ特殊
- Unity 2020.3.20
- Immersal SDK 1.15.0
- Windows 10 Home
- Pixel 4a 5G Android 12
UnityプロジェクトはImmersal SDK Samplesをもとに作成している
Immersalを使ったアプリ開発をしようと思っていたので
んービルドしてみたら
System.FormatException: one of the identified items was in an invalid format at ~~~
が出てきた
これがAndroidのせいなのかImmersalSDKのせいなのかわからないな
いったんIL2CPPにして見ます
IL2CPPにしたらビルド時点で詰まった
載っていたCodeStripping対策もしたがうまくいかない
dllをAssets/ルートに移動したが意味はなかった
バージョン下げてみようかな
今のバージョンは6.0.1で、なんと4日前にリリースされたものらしい
記事にあった5.0.x系で試してみたい
一番DL数が多い5.0.12でやってみる
ちなみに5.0.12は全然DL多くなかった()
試したものの、やっぱり同じ感じになってしまった
同じような投稿がStackpverflowにあった
======
問題の切り分けをしたかったので
まずは空のシンプルなUnityプロジェクトの中に
SignalRパッケージを入れてAndroidビルドで試してみることになった
まずはエディタ。普通に動く
そしてMonoビルド→前回と同じエラーが出る
IL2CPP
まずは普通にビルド→Code Strippingで実行時エラー
記事の通りにlink.xmlを記述→ネに関するエラー
Player SettingsでInternetAccessをrequiredにする→無事動いた
Internet Accessに関するフォーラムはこちら
次はarcore入れてみようか
arcore(ARFoundation)+URPの環境でも正常に動作
ってことはやっぱりImmersal SDKと相性が悪かったのかな
一旦最新のv6.0.1で試したい感じがする
全部のlibがnetstandard2.0に対応していたし
そのあとImmersal-Server-Localizer導入してみるか......
6.0.1にしたら実機でエラーが発生した
変なエラーなので検索せずに色々やっていたら
今度はビルド時にエラーでビルドできなかった
でもこれImmersalのときも見たやつ
Linker.exeみたいなやつがエラー吐いて止まるやつ
Monoのときは出ないけど、IL2CPPにしたら出てきた
でもこれ、途中まではIL2CPPビルドできたので変だ
いったんIlbraryとかLogとかBuildとか消してみる
再起動と化しても駄目だった
なんだろうな
ん-やはりこれが出るな......
ただ、IL2CPPビルド自体は通ったので
元々作っていたImmersalのほうでもLibraryとか消して試してみようかな
HubConnectionBuilderのところで起きてるっぽい
なんとなく、最後のBuild()でDI聞いてる感じがしたんで、そこかなぁ
ああああ元のプロジェクトで動いたああああ
ということで現状おさらい
- SIgnalR CLientは5.0.xを使え
- IL2CPPでInternetAccessはrequireに
- もしIL2CPPでIlnker.exeのエラーが出たらLibraryLog、obj、buildフォルダを消してやり直せ
動いたのでclose