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

> Define data transfer objects to transfer data between client and server.

モジュール内でデータ転送オブジェクトを定義できます。DTO を使用してクライアントとサーバー間でデータを転送できます。

例えば、DTO を使用して、モジュールデータを JSON にシリアル化し、クライアントサイドで同じ構造にデシリアライズできます。

> **Important:**
>
> **重要**: Unity エディターでバインディングを生成し、タイプセーフクライアントコードを使用してモジュールエンドポイントを呼び出すことができます。ほとんどのユースケースでは、Unity プロジェクトに手動で DTO を作成する必要はありません。詳細については、[エディターのバインディングの使用](../run-modules/unity-runtime#use-editor-bindings) を参照してください。

## 前提条件##prerequisites

DTO の使用を準備する前に、[Cloud Code モジュール](../../getting-started) を作成します。

## DTO の管理##manage-dtos

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

### DTO プロジェクトの作成と設定##create-and-configure-your-dto-project

使用の準備をするには、DTO を格納する C# プロジェクトを作成し、メインプロジェクトからそのプロジェクトへの参照を追加します。[プロジェクト内の参照を管理](https://learn.microsoft.com/en-us/visualstudio/ide/managing-references-in-a-project?view=vs-2022) する方法については、Microsoft のドキュメントを参照してください。

モジュールの詳細については、[モジュール構造](../module-structure) を参照してください。

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

`<project_name>.csproj` ファイルを開き、`TargetFramework` を変更します。Unity 2021.2.0 を使用している場合、これは `netstandard.2.1` です。

詳細については、Unity マニュアルの [サポートされる .NET バージョン](https://docs.unity3d.com/2021.2/Documentation/Manual/dotnetProfileSupport.html) を参照してください。

暗黙的な使用を無効にする必要もあります。以下の C# プロジェクト設定例を参照してください。

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

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

</Project>
```

### モジュールへの DTO の追加##add-the-dtos-to-your-module

モジュールに DTO を追加するには、DTO を格納する新しいクラスをプロジェクト内に定義する必要があります。これは以下の例のようになります。

```csharp
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 を使用する##use-dtos-in-your-module-logic

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

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

```csharp
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);
    }

}
```

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

### DLL の抽出##extract-the-dlls

Unity プロジェクトで DTO を使用してレスポンスの型を照合するには、モジュール C# プロジェクトから DLL を抽出する必要があります。

後でモジュール関数を呼び出せるように、このステップの [モジュールをデプロイ](../../getting-started#deploy-the-module) する必要があります。

手動でパッケージ化する場合、アセンブリの生成方法の詳細については、[パッケージコード](../package-code) を参照してください。

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

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

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

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

### Unity プロジェクトへの DLL のインポート##import-the-dlls-to-unity-project

ゲームで外部 DLL を使用するには、Unity プロジェクト内部の `Assets` ディレクトリに DLL を配置します。

次に Unity エディターがプロジェクトと同期するとき、必要な DLL への参照がエディターによって追加されます。

詳細については、[マネージプラグイン](https://docs.unity3d.com/Manual/UsingDLL.html) (Unity マニュアル) を参照してください。

### Unity MonoBehaviour スクリプトでの DTO の再利用##reuse-the-dtos-in-a-unity-monobehaviour-script

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

```csharp
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 to 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}");
    }
}
```

参照として、以下の成功したレスポンスの例を使用します。

```text
"You rolled 5 / 6"
```

詳細については、[Unity Runtime からのモジュールの実行](../run-modules/unity-runtime) に関する説明を参照してください。
