MagicOnionのクライアントとしてUnityで使える grpc-dotnet が利用できるYetAnotherHttpHandlerを使う
クライアントの準備
- Unity2022.3.12f1でプロジェクトを作成
-
Cysharp/YetAnotherHttpHandler: YetAnotherHttpHandler brings the power of HTTP/2 (and gRPC) to Unity and .NET Standard.
- Installationを進める
-
Cysharp/MagicOnion: Unified Realtime/API framework for .NET platform and Unity.
- Support for Unity clientの項目を進める
- gRPC library for Unity clientはスキップ
- MagicOnion.Client.Unity.package (Unity asset package for MagicOnion library)
- MessagePack for C#
- Support for Unity clientの項目を進める
- Grpc.Coreの依存エラーがでる
Assets\Scripts\MagicOnion\MagicOnion.Unity\UnityDebugLogger.cs(2,17): error CS0234: The type or namespace name 'Logging' does not exist in the namespace 'Grpc.Core' (are you missing an assembly reference?)
-
Assets\Scripts\MagicOnion\MagicOnion.Unity\GrpcChannelProvider.cs(174,47): error CS0246: The type or namespace name 'GrpcCCoreGrpcChannelProvider' could not be found (are you missing a using directive or an assembly reference?)
- Projectsettings -> Player -> Script Compilationで Scripting Define Synbolsから
-
USE_GRPC_NET_CLIENT_ONLY
とUSE_GRPC_NET_CLIENT
を追加
-
サーバーの準備
- .NET7でプロジェクトを作る
dotnet add package MagicOnion.Server
sharedをサーバーに置く場合、Unity側でどうやってsharedを使えるようにしようか
Assembly Defnitionファイルで依存関係を整理する...
クライアントコード
とりあえず証明書なしローカルサーバー上で動かせた
クライアントとサーバーののフォルダ構造と依存関係を整理する
MessagePackとMagicOnionとyetanotherhttphandlerをUPM経由でPackageとしてインストール
-
openUPM
-
スコープ付きパッケージレジストリについて
補足
- open upmを使う以外の方法としてgit upmがある
- こんな感じでgit url と バージョンを指定してpackge import することもできる
- packge.jsonが存在するディレクトリをimportしてくれる
- 【Unity Package Manager】GitHubの自作ツールをUPM対応する方法メモ #Unity - Qiita
MOCでコード生成
mpcだけじゃなくてmocのコード生成も必要
D:\UnityProjects\Fuuro\Fuuro\Assets>dotnet moc -i ../OniSync.Shared.csproj -o Scripts/Infra/OniSyncClient/Generated/Magi
cOnion.Generated.cs
一緒
.NET Core 3.1 SDKじゃないとだめなんかな.....?
いれた
実行するSDKバージョンを変更する
使用する .NET のバージョンを選択する - .NET | Microsoft Learn
だめだった
そもそも最新のMagicOnionはdotnet6以上じゃないとダメ
解決した
Unityがプロジェクトルートに生成するcsprojじゃなくて、純粋なcsprojを指定してコード生成すればよかった
自分の場合は、UnityプロジェクトルートのOniSync.Shared.csproj
(Unityが自動生成)じゃなくて、OniSync/OniSync.Shared/OniSync.Shared.csproj
を指定するようにした
ヒントはこのIssue
StremaingHubClientを作ろうとすると以下のエラー
わからん
NotSupportedException: Unable to get client factory for StreamingHub type 'OniSync.Shared.Interfaces.IPlayHub'.
MagicOnion.Client.StreamingHubClient.CreateClient[TStreamingHub,TReceiver] (Grpc.Core.CallInvoker callInvoker, TReceiver receiver, System.String host, Grpc.Core.CallOptions option, MagicOnion.Serialization.IMagicOnionSerializerProvider serializerProvider, MagicOnion.Client.IStreamingHubClientFactoryProvider factoryProvider, MagicOnion.Client.IMagicOnionClientLogger logger)
ここでgRPCチャンネルのオプションを適切に渡すか、適切なfactoryProviderを渡せば解決できそうな気がするが......
こんな感じで渡せば....?
関係あるか.........?
ダメっぽい...
ShareプロジェクトにUnityShimsが入ってなかたので入れた
バックグラウンドでも動くように
MagicOnion5.18 + MessgePack 2.5.124 + YetAnotherHttpHandler 0.10 + StremaingHubの実装で動きました。
IL2CPPビルドも成功してちゃんと動いた
多分どっかでちゃんと記事にする