データ転送オブジェクト (DTO)

モジュール内でデータ転送オブジェクトを定義できます。これらは、クライアントとサーバー間でデータを転送するために使用されます。DTO はモジュールデータを JSON にシリアル化し、クライアントサイドで同じ構造体をデシリアライズする場合に役立つ可能性があります。

前提条件

DTO の使用を準備する前に、Cloud Code モジュール を作成します。

DTO の管理

モジュールエンドポイント関数のデータ型をキャプチャするための DTO を定義できます。

DTO プロジェクトの作成と設定

使用の準備をするには、DTO を格納する C# プロジェクトを作成し、メインプロジェクトからそのプロジェクトへの参照を追加します。プロジェクト内の参照の管理 (Microsoft) を参照してください。

詳細については、モジュール構造 を参照してください。

次に、Unity エディターでサポートされるランタイム .NET バージョン (netstandard) を使用するように DTO C# プロジェクトを設定する必要があります。

<project_name>.csproj ファイルを開き、TargetFramework を変更します。Unity 2021.2.0 を使用している場合、これは netstandard.2.1 です。詳細については、サポートされる .NET バージョン (Unity マニュアル) を参照してください。暗黙的な使用を無効にする必要もあります。以下の C# プロジェクト設定例を参照してください。

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>netstandard2.1</TargetFramework>
        <ImplicitUsings>disable</ImplicitUsings>
        <RootNamespace>DTOSample</RootNamespace>
    </PropertyGroup>

</Project>

モジュールへの DTO の追加

プロジェクトに新しいクラスを定義して DTO を格納します。これは以下のようになります。

namespace DTOSample
{
    public class DiceRollDto
    {
        public DiceRollDto(int roll, int sides)
        {
            Roll = roll;
            Sides = sides;
        }

        public int Roll { get; set; }
        public int Sides { get; set; }
    }
}

モジュールロジックで DTO を使用する

モジュール関数のあるメインプロジェクトで、ゲームロジックを定義し、定義された DTO を関数の戻り値の型として使用します。

以下は、単純なモジュールエンドポイントの例です。

using DTOSample;
using Unity.Services.CloudCode.Core;

namespace Sample;

public class HelloWorld
{
    [CloudCodeFunction("RollDice")]
    public async Task<DiceRollDTO> RollDice(int diceSides)
    {
        var random = new Random();
        var roll = random.Next(1, diceSides);

        return new DiceRollDTO(roll, diceSides);
    }

}

ノート: 入力の DTO を関数パラメーターとして使用することもできます。

DLL の抽出

Unity プロジェクトで DTO を使用してレスポンスの型を照合するには、モジュール C# プロジェクトから DLL を抽出する必要があります。後でモジュール関数を呼び出せるように、このステップの モジュールをデプロイ する必要があります。

モジュールのデプロイ時にアセンブリを生成した場合は、デフォルトで、モジュールプロジェクトの bin/Debug/Release/net6.0/linux-x64/publish フォルダーに DLL があります。

アセンブリは以下のようになります。

├─ Main.csproj
    └─ bin
        └─ Debug
            └─ Release
                └─ net6.0
                    └─ linux-x64
                        └─ publish
                            └─ Main.dll
                            └─ Main.pdb
                            └─ DTOs.dll
                            └─ DTOs.pdb
                            ...

DTOs.dll ファイルをコピーします。

アセンブリの生成方法の詳細については、パッケージコード を参照してください。

Unity プロジェクトへの DLL のインポート

ゲームで外部 DLL を使用するには、Unity プロジェクト内部で Assets ディレクトリに配置するだけです。次に Unity エディターがプロジェクトと同期するときに、必要な DLL への参照が追加されます。

詳細については、マネージプラグイン (Unity マニュアル) を参照してください。

Unity MonoBehaviour スクリプトでの DTO の再利用

次に、Cloud Code SDK を呼び出し、同じ DTO を使用してレスポンスをデシリアライズできます。

using DTOSample;
using UnityEngine;
using Unity.Services.Authentication;
using Unity.Services.CloudCode;
using Unity.Services.Core;

public class Test : MonoBehaviour
{
    // Call this method to roll the dice (use a button)
    public async void Awake()
    {
        await UnityServices.InitializeAsync();
        // Sign in anonymously into the Authentication service
        if (!AuthenticationService.Instance.IsSignedIn) await AuthenticationService.Instance.SignInAnonymouslyAsync();

        // Call out to the Roll Dice script in Cloud Code
        var response = await CloudCodeService.Instance.CallModuleEndpointAsync<DiceRollDto>("Main", "RollDice", new Dictionary<string, object>()
        {
            {"diceSides", 6}
        });

        // Log the response of the script in console
        Debug.Log($"You rolled {response.Roll} / {response.Sides}");
    }
}

正常なレスポンスは以下のようになります。

"You rolled 5 / 6"

詳細については、Unity Runtime からのモジュールの実行 に関する説明を参照してください。