🐻
UnityとMagicOnionで、オブジェクトをやり取りする
はじめに
関数とのやり取りは、オブジェクトでのやり取りも多いと思います!
サンプルを改造して、オブジェクトでやり取りを行うように変更していきます!!
今回のゴールは、UnityとMagicOnionのAndroid・iOS動作確認編(IL2CPP)と同様に、
クライアントから、サーバー側の関数の結果を受け取れるところまで!!
サーバーへ数値をオブジェクトで渡し、足した結果をオブジェクトで受け取り、
クライアントの画面に表示します!!
環境
- Windows 10
- Unity 2020.3.13f1
- VisualStudio 2019
- MagicOnion 4.3.1
- MessagePack-CSharp 2.1.194
- gRPC 2.40.0
前提条件
- 下記の記事の環境構築が完了している、または、同等の環境が構築済みである事
UnityとMagicOnionの環境構築(IL2CPP)
UnityとMagicOnionのAndroid・iOS動作確認編(IL2CPP)
手順
- 通信に使用するオブジェクトを作成
- クライアントのコード修正
- サーバーのコード修正
- 動作確認
■通信に使用するオブジェクトを作成
オブジェクトを格納するフォルダを作成
作業フォルダに、「Entity」フォルダを作成
引数と戻り値のオブジェクト作成
下記の属性を設定して、オブジェクトを作成
- クラスに「MessagePackObject」の属性設定
- 通信に使うパラメータには、「Key」の属性設定
Assets/KumattaApp/Scripts/MagicOnion/Entity/SumAsyncParam.cs
// 引数用
using MessagePack;
[MessagePackObject]
public class SumAsyncParam
{
[Key(0)]
public int X { get; set; }
[Key(1)]
public int Y { get; set; }
}
Assets/KumattaApp/Scripts/MagicOnion/Entity/SumAsyncResult.cs
// 戻り値用
using MessagePack;
[MessagePackObject]
public class SumAsyncResult
{
[Key(0)]
public int Value { get; set; }
}
■クライアントのコード修正
作成したオブジェクトに合うように、インターフェースと呼出し処理の引数、戻り値を修正
Assets/KumattaApp/Scripts/MagicOnion/Server/Services/Interface/IMyFirstService.cs
// インターフェース
using MagicOnion;
namespace MyApp.Shared
{
public interface IMyFirstService : IService<IMyFirstService>
{
UnaryResult<SumAsyncResult> SumAsync(SumAsyncParam param);
}
}
Assets/KumattaApp/Scripts/MyApp/KumattaAppCall.cs
// 呼出し処理
using UnityEngine;
using Grpc.Core;
using MagicOnion.Client;
using MyApp.Shared;
using TMPro;
public class KumattaAppCall : MonoBehaviour
{
void Start()
{
CallTest();
}
public async void CallTest()
{
string host = "localhost";
int port = 5001;
var channel = new Channel(host, port, ChannelCredentials.Insecure);
//var channel = new Channel(host, port, new SslCredentials());
var param = new SumAsyncParam()
{
X = 100,
Y = 23
};
var client = MagicOnionClient.Create<IMyFirstService>(channel);
var result = await client.SumAsync(param);
var textUI = FindObjectOfType<TextMeshProUGUI>();
textUI.text = $"Result: {result.Value}";
}
}
■サーバーのコード修正
引数と戻り値のオブジェクトのフォルダ参照を追加
KumattaApp
└─Scripts
├─MagicOnion
│ ├─Client
│ │ └─Generated
│ ├─Server
│ │ └─Services
│ │ └─Interface
│ └─Entity ← このフォルダの相対パスを設定!!!
└─MyApp
<ItemGroup>
<Compile Include="..\Unityプロジェクト名から「Entity」までのパス\**\*.cs" Link="Entity/%(RecursiveDir)/%(FileName)%(Extension)" />
</ItemGroup>
修正後
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<RootNamespace>KumattaApp_Shared</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MagicOnion.MSBuild.Tasks" Version="4.3.1" />
<PackageReference Include="MagicOnion.Shared" Version="4.3.1" />
<PackageReference Include="MessagePack.MSBuild.Tasks" Version="2.1.194">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="MessagePack.UnityShims" Version="2.1.194" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\KumattaApp-Client\Assets\KumattaApp\Scripts\MagicOnion\Server\**\*.cs" Link="Server/%(RecursiveDir)/%(FileName)%(Extension)" />
<Compile Include="..\KumattaApp-Client\Assets\KumattaApp\Scripts\MagicOnion\Entity\**\*.cs" Link="Entity/%(RecursiveDir)/%(FileName)%(Extension)" />
</ItemGroup>
<Target Name="GenerateMessagePack" AfterTargets="Compile">
<MessagePackGenerator input="$(ProjectPath)" output="..\KumattaApp-Client\Assets\KumattaApp\Scripts\MagicOnion\Client\Generated\MessagePack.Generated.cs" />
</Target>
<Target Name="GenerateMagicOnion" AfterTargets="Compile">
<MagicOnionGenerator Input="$(ProjectPath)" Output="..\KumattaApp-Client\Assets\KumattaApp\Scripts\MagicOnion\Client\Generated\MagicOnion.Generated.cs" />
</Target>
</Project>
修正したインターフェースに合うように、引数、戻り値を修正
KumattaApp-Server/Services/MyFirstService.cs
using MagicOnion;
using MagicOnion.Server;
using MyApp.Shared;
using System;
namespace KumattaAppServer.Services
{
public class MyFirstService : ServiceBase<IMyFirstService>, IMyFirstService
{
public async UnaryResult<SumAsyncResult> SumAsync(SumAsyncParam param)
{
Console.WriteLine($"Received:{param.X}, {param.Y}");
var result = new SumAsyncResult()
{
Value = param.X + param.Y
};
return result;
}
}
}
■動作確認
- サーバー起動
- クライアントの実行
起動したアプリの画面に、結果が表示されれば成功!!
あとがき
ここまで読んでいただきありがとうございます!!!
次回は、「StreamingHub」使用した、リアルタイム通信について書こうと思います!!
Discussion