# Unity Runtime からの呼び出し

> Invoke module endpoints from an authenticated game client in the Unity Editor.

Unity エディターで認証されたゲームクライアントから呼び出すことでモジュールエンドポイントを実行します。

> **Note:**
>
> **ノート:** モジュールが過去 15 分間にトラフィックを受信しなかった場合、コールドスタートの待ち時間が発生する可能性があります。その後のモジュールへの呼び出しは、より高速になります。

## 前提条件##prerequisites

Unity エディターで Cloud Code を使用するには、最初に Cloud Code SDK をインストールし、[Unity Gaming Services プロジェクト](/cloud/projects.md) を Unity エディターにリンクする必要があります。

## プロジェクトのリンク##link-project

[Unity Gaming Services プロジェクト](/cloud/projects.md) を Unity エディターにリンクします。UGS プロジェクト ID は Unity Dashboard にあります。

1. Unity エディターで、**Edit** (編集) > **Project Settings** (プロジェクト設定) > **Services** (サービス) の順に選択します。

2. プロジェクトをリンクします。

   * プロジェクトに Unity プロジェクト ID がない場合:

     1. **Create a Unity Project ID** (Unity プロジェクト ID の作成) > **Organizations** (組織) の順に選択し、ドロップダウンメニューから組織を選択します。
     2. **Create project ID** (プロジェクト ID を作成) を選択します。

   * 既存の Unity プロジェクト ID がある場合:

     1. **Use an existing Unity project ID** (既存の Unity プロジェクト ID を使用) を選択します。
     2. ドロップダウンメニューから組織とプロジェクトを選択します。
     3. **Link project ID** (プロジェクト ID をリンク) を選択します。

Unity プロジェクト ID が表示され、プロジェクトが Unity サービスにリンクされました。また、`UnityEditor.CloudProjectSettings.projectId` を使用して Unity エディタースクリプトのプロジェクト ID にアクセスすることもできます。

## SDK のインストール##sdkinstallation

Unity エディターの最新の Cloud Code パッケージをインストールするには、以下を行います。

1. Unity エディターで、**Window** (ウィンドウ) > **Package Manager** (パッケージマネージャー) を開きます。
2. Package Manager で、**Unity Registry** (Unity レジストリ) のリストビューを選択します。
3. `com.unity.services.cloudcode` を検索するか、リストから Cloud Code パッケージを探します。
4. このパッケージを選択し、**Install** (インストール) をクリックします。

> **Note:**
>
> [Unity - マニュアル: Package Manager ウィンドウ](https://docs.unity3d.com/Manual/upm-ui.html) を参照し、Unity Package Manager インターフェースについて理解してください。

## SDK の設定##sdk-setup

Cloud Code SDK の使用を準備するには、以下を行います。

1. Cloud Code サービスダッシュボードページを介してサービスが有効になっていることを確認します。
2. Cloud Code と Authentication SDK の両方をインストールしたことを確認します。
3. **Edit** (編集) > **Project Settings...** (プロジェクト設定...) > **Services** (サービス) を選択して、Unity エディター内からクラウドプロジェクトにサインインします。
4. Unity エディターで新しい C# Monobehaviour スクリプトを作成します。Unity マニュアルの [スクリプトの作成と使用](https://docs.unity3d.com/Manual/CreatingAndUsingScripts.html) を参照してください。
5. スクリプトで、await `UnityServices.InitializeAsync()` を使用して Core SDK を初期化します。
6. スクリプトで、Authentication SDK を初期化します。

## 典型的なワークフロー##typical-workflow

Cloud Code SDK は、Unity エディター内で通常の MonoBehaviour C# スクリプトから呼び出すことができます。

1. Unity Engine 内で C# `MonoBehaviour` スクリプトを作成します。[Unity - マニュアル:スクリプトの作成と使用](https://docs.unity3d.com/Manual/CreatingAndUsingScripts.html) を参照してください。
2. `MonoBehaviour` スクリプト内で、[Unity Authentication](#authentication) サービスを設定します。
3. `MonoBehaviour` スクリプト内で、Cloud Code SDK の呼び出しを追加します。
4. `MonoBehaviour` スクリプトをゲームオブジェクトにアタッチします。[エディターのスクリプト](https://docs.unity3d.com/Manual/ScriptingSection.html) に関するドキュメントを参照してください。
5. **Play** (再生) を選択し、プロジェクトを実行して Cloud Code の動作を確認します。

## 認証##authentication

プレイヤーが Cloud Code サービスにアクセスするには有効なプレイヤー ID とアクセストークンが必要です。いずれかの Cloud Code API を使用する前にプレイヤーを Authentication SDK で認証する必要があります。C# Monobehaviour スクリプトの内部で Authentication SDK を初期化することで、これを行うことができます。[プレイヤーの認証](../authentication#authenticate-players) を参照してください。

Authentication SDK を初期化するには、C# Monobehaviour スクリプトに以下を追加します。

*C#*

```cs
await AuthenticationService.Instance.SignInAnonymouslyAsync();
```

使用の準備をするには、匿名認証の使用をお勧めします。以下の例は、認証パッケージを使用して匿名認証を開始し、Unity エディター内でスクリプトにプレイヤー ID を記録する方法を示しています。

*C#*

```cs
using Unity.Services.Authentication;
using System.Threading.Tasks;
using Unity.Services.Core;
using UnityEngine;

public class AuthenticationExample : MonoBehaviour
{
    internal async Task Awake()
    {
        await UnityServices.InitializeAsync();
        await SignInAnonymously();
    }

    private async Task SignInAnonymously()
    {
        AuthenticationService.Instance.SignedIn += () =>
        {
            var playerId = AuthenticationService.Instance.PlayerId;

            Debug.Log("Signed in as: " + playerId);
        };
        AuthenticationService.Instance.SignInFailed += s =>
        {
            // Take some action here...
            Debug.Log(s);
        };

        await AuthenticationService.Instance.SignInAnonymouslyAsync();
    }
}
```

## Cloud Code モジュールエンドポイントの呼び出し##calling-a-cloud-code-module-endpoint

新規に作成したスクリプトに認証を追加すると、Cloud Code モジュールエンドポイントを呼び出す準備が整います。以下の名前空間を追加して、Cloud Code を Unity エディタープロジェクトに統合します。

```cs
Using Unity.Services.CloudCode;
```

以下のサンプルでは、次のコードを使用してモジュール `HelloWorld` を `RollDice` というエンドポイントでデプロイしたと仮定しています。

```csharp
using System;
using System.Threading.Tasks;
using Unity.Services.CloudCode.Core;

namespace HelloWorld;

public class HelloWorld
{
    public class Response
    {
        public Response(int roll, int sides)
        {
            Roll = roll;
            Sides = sides;
        }

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

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

        return new Response(roll, diceSides);
    }
}
```

### エディターのバインディングの使用##use-editor-bindings

Cloud Code モジュールについてエディターのバインディングを生成して、Unity エディターインターフェースで使用できます。詳細については、[バインディングの生成](../write-modules/unity-editor#generate-bindings) を参照してください。

以下の例は、Unity エディターから Cloud Code モジュールを呼び出すタイプセーフの方法です。C# MonoBehaviour スクリプト `RollDiceExample` を Unity エディターで作成し、以下のコードを加えます。

*C#*

```cs
using Unity.Services.Authentication;
using Unity.Services.CloudCode;
using Unity.Services.CloudCode.GeneratedBindings;
using Unity.Services.Core;
using UnityEngine;

public class RollDiceExample : MonoBehaviour
{
    private async void Start()
    {
        // Initialize the Unity Services Core SDK
        await UnityServices.InitializeAsync();

        // Authenticate by logging into an anonymous account
        await AuthenticationService.Instance.SignInAnonymouslyAsync();

        try
        {
            // Call the function within the module and provide the parameters we defined in there
            var module = new HelloWorldBindings(CloudCodeService.Instance);
            var result = await module.RollDice(6);

            Debug.Log($"You've rolled {result.Roll}/{result.Sides}");
        }
        catch (CloudCodeException exception)
        {
            Debug.LogException(exception);
        }
    }
}
```

### `CallModuleEndpointAsync` の使用##use-callmoduleendpointasync

`CloudCodeService.Instance` の下にある `CallModuleEndpointAsync` API クライアントメソッドも使用できます。

*C#*

```cs
        /// <summary>
        /// Calls a Cloud Code function.
        /// </summary>
        /// <param name="module">Cloud Code Module to call</param>
        /// <param name="function">Cloud Code function to call.</param>
        /// <param name="args">Arguments for the cloud code function. Will be serialized to JSON.</param>
        /// <typeparam name="TResult">Serialized from JSON returned by Cloud Code.</typeparam>
        /// <returns>Serialized output from the called function.</returns>
        /// <exception cref="CloudCodeException">Thrown if request is unsuccessful.</exception>
        /// <exception cref="CloudCodeRateLimitedException">Thrown if the service returned rate limited error.</exception>
        Task<TResult> CallModuleEndpointAsync<TResult>(string module, string function, Dictionary<string, object> args = null);
```

* `module` パラメーターはモジュールの名前です。
* `function` パラメーターは、`CloudCodeFunction` 属性でラベルを付けたモジュールエンドポイントの名前です。
* `args` パラメーターは、モジュールエンドポイントに渡すパラメーターのディクショナリです。

Unity エディターで C# Monobehaviour スクリプト `RollDiceExample` を作成します。以下は、Authentication と Cloud Code の両方をスクリプトに統合する方法の完全な例です。

```cs
using System.Collections.Generic;
using UnityEngine;
using Unity.Services.Authentication;
using Unity.Services.CloudCode;
using Unity.Services.Core;

public class RollDiceExample : MonoBehaviour
{
    // ResultType structure is the serialized response from the RollDice script in Cloud Code
    private class ResultType
    {
        public int Roll;
        public int Sides;
    }

    // Call this method
    public async void CallMethod()
    {
        await UnityServices.InitializeAsync();
        // Sign in anonymously into the Authentication service
        if (!AuthenticationService.Instance.IsSignedIn) await AuthenticationService.Instance.SignInAnonymouslyAsync();

        // Call out to the RollDice endpoint in the HelloWorld module in Cloud Code
        var response = await CloudCodeService.Instance.CallModuleEndpointAsync<ResultType>("HelloWorld", "RollDice", new Dictionary<string, object>( ) { { "diceSides", 6 } });

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

### スクリプトの実行##run-the-script

スクリプトを実行するには、Unity エディターでゲームオブジェクトにアタッチしてから、**Play** (再生) を選択します。

以下のコードを `Start()` メソッドに加えると、`CallMethod()` メソッドを呼び出すことができます。

```csharp
    public void Start()
    {
        CallMethod();
    }
```
