# 他の Unity サービスとのインテグレーション

> Integrate Cloud Code with various Unity Gaming Services using C# Software Development Kits or REST APIs.

Cloud Code の可能性を最大限に引き出すために、C# Service SDK または REST API を使用して、Cloud Code をさまざまな Unity Gaming Services とシームレスに統合できます。

C# SDK は、よりシンプルで一貫性のある体験を提供し、Unity Gaming Services へのアクセスが便利になります。利用したい Unity Gaming Services のサービスにすでに Cloud Code C# SDK がある場合は、それを利用して、よりスムーズに統合できます。ただし、特定の UGS サービスに Cloud Code C# SDK がない場合は、REST API を通じて直接接続できる柔軟性があります。

## UGS SDK を使用して UGS に接続する##connect-to-ugs-through-the-ugs-sdks

NuGet から Cloud Code C# サービス SDK にアクセスするには、[Com.Unity.Services.CloudCode.Apis](https://www.nuget.org/packages/Com.Unity.Services.CloudCode.Apis) を検索します。パッケージをインストールした後で、C# モジュール内でそれを使用して、他の Unity サービスに接続する方法を簡略化できます。

> **Note:**
>
> **ノート**: Cloud Code C# SDK のドキュメントは不完全です。詳細については、構造が似ている [JavaScript のドキュメント](../../scripts/how-to-guides/unity-services-integration) を参照してください。IDE のオートコンプリートと intellisense 機能も利用してください。

Cloud Code C# SDK の完全なリストについては、[利用可能なライブラリ](../reference/available-libraries) のページを参照してください。

### API クライアント##api-clients

`GameApiClient` クラスと `AdminApiClient` クラスはどちらも Cloud Code C# SDK のラッパーであり、Cloud Code モジュールから Unity Gaming Services (UGS) を呼び出すための簡略化されたインターフェースを提供します。ただし、それぞれ異なる目的のために用意されており、異なるユースケース向けに設計されています。

### `GameApiClient` クラスの使用##use-the-gameapiclient-class

`GameApiClient` クラスは、UGS が提供する標準的なゲーミングサービスとの対話に特化して調整されています。これにより、ゲームデータの保存や取得など、プレイヤー固有の機能に関連する UGS サービスを Cloud Code モジュールから呼び出すプロセスが簡素化されます。提供されている例では、クラスを使用して Cloud Save 機能を操作し、プレイヤーデータを保存および取得する方法を示しています。

`GameApiClient` インターフェースを使用するには、`GameApiClient` を [シングルトン](./initialize-modules/dependency-injection.md) として `ICloudCodeSetup` コンフィギュレーターに登録します。

```csharp
public class ModuleConfig : ICloudCodeSetup
{
    public void Setup(ICloudCodeConfig config)
    {
        config.Dependencies.AddSingleton(GameApiClient.Create());
    }
}
```

#### 使用例##usage-example

`CloudCodeFunction` 属性を設定する任意の関数で `GameApiClient` クラスを使用できます。`GameApiClient` クラスを使用するには、`IGameApiClient` インターフェースをパラメーターとして関数に渡します。

以下の例は、Cloud Save からデータを保存および読み取る方法を示します。

```csharp
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Unity.Services.CloudCode.Apis;
using Unity.Services.CloudCode.Core;
using Unity.Services.CloudCode.Shared;
using Unity.Services.CloudSave.Model;

namespace ExampleModule;

public class CloudSaveSdkSample
{
    private static ILogger<CloudSaveSdkSample> _logger;

    public CloudSaveSdkSample(ILogger<CloudSaveSdkSample> logger)
    {
        _logger = logger;
    }

    [CloudCodeFunction("SaveData")]
    public async Task SaveData(IExecutionContext context, IGameApiClient gameApiClient, string key, object value)
    {
        try
        {
            await gameApiClient.CloudSaveData.SetItemAsync(context, context.AccessToken, context.ProjectId,
                context.PlayerId, new SetItemBody(key, value));
        }
        catch (ApiException ex)
        {
            _logger.LogError("Failed to save data. Error: {Error}", ex.Message);
            throw new Exception($"Failed to save data for playerId {context.PlayerId}. Error: {ex.Message}");
        }
    }

    [CloudCodeFunction("GetData")]
    public async Task<object> GetData(IExecutionContext context, IGameApiClient gameApiClient, string key)
    {
        try
        {
            var result = await gameApiClient.CloudSaveData.GetItemsAsync(context, context.AccessToken,
                context.ProjectId, context.PlayerId, new List<string> { key });
            return result.Data.Results.First().Value;
        }
        catch (ApiException ex)
        {
            _logger.LogError("Failed to get data. Error: {Error}", ex.Message);
            throw new Exception($"Failed to get data for playerId {context.PlayerId}. Error: {ex.Message}");
        }
    }

    public class ModuleConfig : ICloudCodeSetup
    {
        public void Setup(ICloudCodeConfig config)
        {
            config.Dependencies.AddSingleton(GameApiClient.Create());
        }
    }
}
```

### `AdminApiClient` クラスの使用##use-the-adminapiclient-class

`AdminApiClient` クラスは、UGS サービスの管理機能にアクセスするためのものです。Cloud Code モジュールから UGS 管理関連サービスを呼び出すための簡略化されたインターフェースを提供します。この例では、AdminApiClient を使用してリーダーボードを作成する方法を示し、管理タスク用のユーティリティを紹介します。

`AdminApiClient` インターフェースを使用するには、`AdminApiClient` を [シングルトン](./initialize-modules/dependency-injection.md) として `ICloudCodeSetup` コンフィギュレーターに登録します。

```csharp
public class ModuleConfig : ICloudCodeSetup
{
    public void Setup(ICloudCodeConfig config)
    {
        config.Dependencies.AddSingleton(AdminApiClient.Create());
    }
}
```

#### 使用例##usage-example

`GameApiClient` と同様に、`AdminApiClient` クラスは、CloudCodeFunction にアトリビュートする任意の関数で使用できます。`AdminApiClient` クラスを使用する場合は、`IAdminApiClient` インターフェースをパラメーターとして関数に渡します。

> **Note:**
>
> **ノート**: admin SDK で管理機能を使用するには、`Leaderboards Admin` プロジェクトロールを持つ有効なサービスアカウント認証情報が必要です。サービスアカウントを作成するには、[管理者認証](https://services.docs.unity.com/docs/service-account-auth/) を参照してください。

> **Important:**
>
> **注意**: この Cloud Code の例では、ハードコードされたプレーンテキストのサービスアカウント認証情報の使用方法を示しています。シークレットが入った認証情報とコードを処理する場合は注意してください。セキュリティを確保するために、シークレットをバージョン管理にコミットしないことをお勧めします。認証情報が侵害された場合は、サービスアカウント認証情報をすぐに再生成できます。Cloud Code に認証情報を保存するためのより安全な方法を開発中です。

以下の例は、リーダーボードを作成する方法を示しています。

```csharp
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Unity.Services.CloudCode.Apis;
using Unity.Services.CloudCode.Apis.Admin;
using Unity.Services.CloudCode.Core;
using Unity.Services.CloudCode.Shared;
using Unity.Services.Leaderboards.Admin.Model;

namespace ExampleModule;

public class ModuleMain
{
    private static ILogger<ModuleMain> _logger;

    public ModuleMain(ILogger<ModuleMain> logger)
    {
        _logger = logger;
    }

    [CloudCodeFunction("CreateLeaderboard")]
    public async Task CreateLeaderboard(IExecutionContext context, IAdminApiClient adminApiClient)
    {
        try
        {
            await adminApiClient.Leaderboards.CreateLeaderboardAsync(
                executionContext: context,
                serviceAccountKey: "YOUR_SERVICE_ACCOUNT_KEY",
                serviceAccountSecret: "YOUR_SERVICE_ACCOUNT_SECRET",
                projectId: Guid.Parse(context.ProjectId),
                environmentId: Guid.Parse(context.EnvironmentId),
                leaderboardIdConfig: new LeaderboardIdConfig(
                    id: "new-leaderboard",
                    name: "new-leaderboard",
                    sortOrder: SortOrder.Asc,
                    updateType: UpdateType.KeepBest
                )
            );
        }
        catch (ApiException ex)
        {
            _logger.LogError("Failed to create a Leaderboard. Error: {Error}", ex.Message);
            throw new Exception($"Failed to create a Leaderboard. Error: {ex.Message}");
        }
    }

    public class ModuleConfig : ICloudCodeSetup
    {
        public void Setup(ICloudCodeConfig config)
        {
            config.Dependencies.AddSingleton(AdminApiClient.Create());
        }
    }
}

```

## REST API を通じた UGS への接続##connect-to-ugs-through-rest-apis

C# SDK がまだないサービスを使用する場合は、それらの REST API を通じてサービスに直接接続することもできます。

### 認証##authentication

ユースケースに応じて、`AccessToken` または `ServiceToken` を使用して API 呼び出しを認証できます。`ServiceToken` を使用して UGS Client API を認証する場合は、呼び出すサービスでサービストークンがサポートされていることを確認します。サービストークンをサポートするサービスとユースケースのリストについては、[サービスとアクセストークンのサポート](./token-support.md) のドキュメントを参照してください。

> **Note:**
>
> **ノート**: 呼び出すサービスで Cloud Code C# SDK が提供される場合は、サービス API を直接呼び出すかわりに SDK を使用できます。詳細については、[利用可能なライブラリ](../reference/available-libraries) のリストを参照してください。

### API の呼び出し##calling-the-api

[依存性注入](./initialize-modules/dependency-injection.md) により、API インターフェースをシングルトンとして作成し、モジュールに挿入できます。

> **Note:**
>
> UGS API に加えて、外部 API をシングルトンとして実装することもできます。外部 API の実装方法の例については、[外部サービスとのインテグレーション](./external-services-integration.md) の方法に関するドキュメントを参照してください。
