# Unity Runtime からの呼び出し

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

Unity エディターで認証されたゲームクライアントから呼び出すことでスクリプトを実行します。

## 前提条件##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 は、公開されたスクリプトのみを呼び出すことができます。スクリプトの作成と公開の方法について詳しくは、[スクリプトの作成](../write-scripts) を参照してください。

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

1. Unity Dashboard ページの 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.mdx#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-script

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

*C#*

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

作成したスクリプトを実行するには、`CloudCodeService.Instance` の下にある `CallEndpointAsync` API クライアントメソッドを使用します。

*C#*

```cs
/// <summary>
/// Calls a Cloud Code function.
/// </summary>
/// <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>
public async Task<TResult> CallEndpointAsync<TResult>(string function, Dictionary<string, object> args)
```

`function` パラメーターがスクリプトの名前であることに注意します。スクリプトの名前を Unity Dashboard で見つけるには、**Cloud Code** を開き、**Scripts** (スクリプト) タブを選択します。

## C# Monobehaviour スクリプトの完全なインテグレーション例##full-integration-example-using-c-monobehaviour-script

以下のコードを使用して、`diceSides` integer パラメーターが指定された `RollDice` スクリプトを公開できます。

### JavaScript##javascript

```js
const _ = require("lodash-4.17");
module.exports = async ({ params, context, logger }) => {
  const roll = rollDice(params.diceSides);

  if (roll > params.diceSides) {
    // Log an error message with information about the exception
    logger.error("The roll is greater than the number of sides: " + roll);
    // Return an error back to the client
    throw Error("Unable to roll dice!");
  }
  return {
    sides: params.diceSides,
    roll: roll,
  };
};

function rollDice(sides) {
  return _.random(1, sides);
}
```

以下は、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 to roll the dice (use a button)
    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 Roll Dice script in Cloud Code
        var response = await CloudCodeService.Instance.CallEndpointAsync<ResultType>("RollDice", new Dictionary<string, object>( ) { { "diceSides", 6 } });

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

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

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

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

Cloud Code スクリプトからのレスポンスをお好みのタイプにシリアル化できます。Cloud Code SDK の詳細については、[Cloud Code SDK API](https://docs.unity3d.com/Packages/com.unity.services.cloudcode@latest/index.html?subfolder=/api/Unity.Services.CloudCode) を確認してください。
