🐻

UnityとMagicOnionで、オブジェクトをやり取りする

6 min read

はじめに

関数とのやり取りは、オブジェクトでのやり取りも多いと思います!
サンプルを改造して、オブジェクトでやり取りを行うように変更していきます!!

今回のゴールは、UnityとMagicOnionのAndroid・iOS動作確認編(IL2CPP)と同様に、
クライアントから、サーバー側の関数の結果を受け取れるところまで!!
サーバーへ数値をオブジェクトで渡し、足した結果をオブジェクトで受け取り、
クライアントの画面に表示します!!

環境

前提条件

手順

  1. 通信に使用するオブジェクトを作成
  2. クライアントのコード修正
  3. サーバーのコード修正
  4. 動作確認

■通信に使用するオブジェクトを作成

オブジェクトを格納するフォルダを作成

作業フォルダに、「Entity」フォルダを作成

引数と戻り値のオブジェクト作成

下記の属性を設定して、オブジェクトを作成

  1. クラスに「MessagePackObject」の属性設定
  2. 通信に使うパラメータには、「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>

修正したインターフェースに合うように、引数、戻り値を修正

戻り値が無い関数を作る場合は、下記のように戻り値を設定します

public async UnaryResult<Nil> Huga()
{
    Console.WriteLine("HUGA!!!!");    
    return Nil.Default;
}
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;
        }
    }
}

■動作確認

  1. サーバー起動
  2. クライアントの実行

起動したアプリの画面に、結果が表示されれば成功!!

あとがき

構築した環境のGitHub

ここまで読んでいただきありがとうございます!!!
次回は、「StreamingHub」使用した、リアルタイム通信について書こうと思います!!