# 手動ワークフロー

> Create a C# module manually with control over the module deployment process.

このセクションでは、プロジェクトで C# モジュールを作成するために必要なステップについて説明します。

> **Important:**
>
> **重要**: 手動ワークフローは、モジュールを作成してデプロイするための低レベルのアプローチです。このワークフローは、モジュールデプロイプロセスを細かく制御する必要がある高度なケースに最適です。ほとんどのユースケースでは、簡素化された操作の [Unity エディター](./write-modules/unity-editor.md) または [UGS CLI](./write-modules/cli.md) を使用できます。すぐに開始するには、[使用の準備](../getting-started) ガイドを参照してください。

Cloud Code モジュールの使用を準備するには、以下のステップに従う必要があります。

1. [.NET プロジェクトの作成:](#create-a-net-project)Cloud Code モジュールは、ゲームクライアントが呼び出すことのできるエンドポイントを公開する単純な .NET プロジェクトです。
2. [Cloud Code Authoring パッケージのインポート:](#import-the-cloud-code-authoring-package)Cloud Code Authoring パッケージをインストールして、呼び出せるエンドポイントを作成します。
3. [プロジェクト内部のモジュールエンドポイントの作成:](#create-a-module-endpoint)ゲームクライアントから呼び出せるゲームロジックを定義します。
4. [コードのパッケージ化:](#package-code)プロジェクトのアセンブリを生成し、それらをアーカイブにパッケージ化します。
5. [プロジェクトのデプロイ:](#deploy-a-module-project)アーカイブを Cloud Code サービスにデプロイします。
6. [モジュールエンドポイントの呼び出し:](#call-a-module-function-from-your-game)ゲームクライアントからモジュールエンドポイントを呼び出します。

### .NET プロジェクトの作成##create-a-net-project

Cloud Code モジュールは、ゲームクライアントが呼び出すことのできるエンドポイントを公開する単純な .NET プロジェクトです。使用の準備をするには、選択した IDE に新しい .NET プロジェクトを作成します。Cloud Code モジュールがどのように構造化されるかについては、[モジュール構造](./module-structure.md) を参照してください。

以下のセクションでは、JetBrains Rider および Microsoft Visual Studio IDE でプロジェクトを作成する方法を示します。

#### JetBrains Rider##jetbrains-rider

以下のステップに従って、JetBrains Rider に新しいプロジェクトを作成します。

1. **File** (ファイル) > **New** (新規) を選択します。
2. クラスライブラリ (**.NET Core** または **.NET Framework**) を選択します。
3. モジュールに名前を付けます。
4. **Create** (作成) を選択します。

#### Microsoft Visual Studio##microsoft-visual-studio

以下のステップに従って、Microsoft Visual Studio に新しいプロジェクトを作成します。

1. **File** (ファイル) > **New Solution** (新しいソリューション) を選択します。
2. .Net クラスライブラリを選択します。
3. **Next** (次へ) を選択します。
4. モジュールに名前を付けます。
5. **Create** (作成) を選択します。

### Cloud Code Authoring パッケージのインポート##import-the-cloud-code-authoring-package

Cloud Code モジュールは .NET プロジェクトであるため、[NuGet パッケージマネージャー](https://docs.microsoft.com/en-us/nuget/what-is-nuget) を使用して依存関係を管理します。

Cloud Code モジュールでは、呼び出せるエンドポイントを作成できるように Cloud Code Authoring パッケージが必要です。これは、プロジェクトにインストールできる NuGet パッケージです。

以下のセクションは、以下の IDE でパッケージをインポートする方法を示します。

#### JetBrains Rider##jetbrains-rider

以下のステップに従い、JetBrains Rider を使用して Cloud Code Authoring パッケージをインストールします。

1. **Tools** (ツール) > **NuGet** > **Show NuGet Packages** (NuGet パッケージの表示) を選択します。
2. `Com.Unity.Services.CloudCode.Core` を検索します。
3. 最新バージョンをプロジェクトにインストールします。

#### Microsoft Visual Studio##microsoft-visual-studio

以下のステップに従い、Microsoft Visual Studio を使用して Cloud Code Authoring パッケージをインストールします。

1. プロジェクト > **Manage NuGet Packages** (NuGet パッケージの管理) を右クリックします。
2. `Com.Unity.Services.CloudCode.Core` を検索します。
3. **Add Package** (パッケージの追加) を選択します。

### モジュールエンドポイントの作成##create-a-module-endpoint

C# モジュール内にエンドポイントを作成するには、外部呼び出し可能な関数を作成し、`CloudCodeFunction` 属性を設定して公開名を付けます。

関数名は異なっていても構わず、これによりゲームクライアントがすでに呼び出している関数を中断することなく後でコードをリファクタリングできます。

参照のために、以下の単純なモジュール関数の例を使用します。この例は、`name` という文字列パラメーターを受け取って文字列を返す `SayHello` というモジュールエンドポイントを作成します。

```cs
using Unity.Services.CloudCode.Core;

namespace ExampleModule;

public class MyModule
{
    [CloudCodeFunction("SayHello")]
    public string Hello(string name)
    {
        return $"Hello, {name}!";
    }
}
```

### コードのパッケージ化##package-code

モジュールをデプロイする前に、コードをアーカイブにパッケージ化する必要があります。

このアーカイブには、Cloud Code サービスがモジュールを実行するために必要とするアセンブリが含まれている必要があります。

これらのアセンブリを生成するために [プロジェクトを公開](https://learn.microsoft.com/en-us/dotnet/core/deploying/deploy-with-cli) できます。

`linux-x64` ターゲットランタイムのアセンブリをビルドする必要があります。パフォーマンスを改善するには、`ReadyToRun` コンパイルを有効にします。

* アセンブリの生成方法の詳細については、[パッケージコード](./package-code.md) を参照してください。
* このプロセスを自動化する方法の詳細については、[ローカルデプロイの自動化](./automate-local-deployment.md) を参照してください。

以下のステップに従って、アセンブリを生成するように IDE を設定します。

#### JetBrains Rider##jetbrains-rider

JetBrains Rider IDE を使用してアセンブリを生成するには、以下のステップに従います。

1. **Run** (実行) > **Edit Configurations** (設定の編集) を選択します。
2. **+** を選択します。
3. **Publish to folder** (フォルダーに公開) を選択します。
4. 設定に名前を付けます。
5. **Target location** (ターゲットの場所) を、ビルド出力を格納する場所に設定します。
6. **Release | Any CPU** (リリース | 任意の CPU) 設定を選択します。
7. **linux-x64** ターゲットランタイムを選択します。
8. (任意) **Enable ReadyToRun compilation** (ReadyToRun コンパイルの有効化) を有効にします。
9. **Apply** (適用) を選択します。

#### Microsoft Visual Studio##microsoft-visual-studio

Microsoft Visual Studio IDE を使用してアセンブリを生成するには、以下のステップに従います。

1. ソリューションを右クリックしてから、**Publish** (公開) を選択します。
2. 画面のステップに従って、ファイルをローカルに格納します。
3. **Show All Settings** (すべての設定の表示) を選択します。
4. ターゲットランタイムを **linux-x64** に設定します。
5. **Save** (保存) を選択します。
6. **Publish** (公開) を選択します。

#### アセンブリの圧縮##zip-the-assemblies

デフォルトでは、公開プロセスはルートプロジェクトディレクトリの下の `bin/Release/net6.0/linux-x64/publish` パスにフォルダーを生成します。このフォルダーのコンテンツをアーカイブに圧縮する必要があります。

[UGS CLI を使用してモジュールをデプロイする](./write-modules/cli.md#deploy-modules) 場合は、アーカイブの拡張子を .ccm に変更することをお勧めします。

> **Note:**
>
> **ノート**: Windows のエクスプローラーを使用する場合、アーカイブの拡張子を .ccm に変更するには、[一般的なファイル名拡張子を有効にする](https://support.microsoft.com/en-us/windows/common-file-name-extensions-in-windows-da4a4430-8e76-89c5-59f7-1cdbbc75cb01) 必要があります。

Unix システムでは、以下のコマンドを実行します。

`zip ExampleModule.ccm *`

Windows システムでは、以下のコマンドを実行します。

`zip -r ExampleModule.ccm path/to/your/project/bin/Release/net6.0/linux-x64/publish/*`

### モジュールプロジェクトのデプロイ##deploy-a-module-project

モジュールエンドポイントをゲームクライアントからアクセス可能にするには、Cloud Code サービスにアーカイブをデプロイする必要があります。

モジュールデプロイの詳細については、[モジュールの記述](./write-modules.md) を参照してください。

UGS CLI を使用してデプロイするには、アーカイブファイルの拡張子を .ccm に変更する必要があります。

#### UGS CLI の設定##configure-the-ugs-cli

以下のステップに従って、UGS CLI の使用を準備します。

1. [UGS CLI をインストール](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/install-the-cli/) します。
2. 以下のコマンドを使用して、プロジェクト ID と環境を設定します。
   `ugs config set project-id <your-project-id>`
   `ugs config set environment-name <your-environment-name>`
3. [Cloud Code](https://services.docs.unity.com/docs/service-account-auth/index.html#cloud-code-editor) と [環境管理](https://services.docs.unity.com/docs/service-account-auth/index.html#unity-environments-admin) に必要なロールでサービスアカウントを設定します。[認証の取得](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/get-authenticated/) を参照してください。

#### モジュールのデプロイ##deploy-the-module

モジュールをデプロイするには、以下のコマンドを実行します。

`ugs deploy <path-to-ccm-file>`

### ゲームからのモジュール関数の呼び出し##call-a-module-function-from-your-game

モジュールをデプロイした後で、ゲームクライアントからモジュール関数を呼び出すことができます。

#### 前提条件##prerequisites

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

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

UGS プロジェクト ID は Unity Dashboard にあります。以下のステップに従って、[Unity Gaming Services プロジェクト](/cloud/projects.md) を Unity エディターにリンクします。

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 のインストール##sdk-installation

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

##### SDK の設定##sdk-setup

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

1. [Unity Dashboard](https://cloud.unity.com) の 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 を初期化します。

> **Note:**
>
> **ノート**: プレイヤーが Cloud Code サービスにアクセスするには有効なプレイヤー ID とアクセストークンが必要です。どの Cloud Code API を使用する場合でも前もってプレイヤーを Authentication SDK で認証する必要があります。匿名認証用の以下のコードスニペットを使用するか、詳細および他のサインイン方法について [Authentication SDK](./authentication.md) のドキュメントを確認できます。

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

#### モジュール関数の呼び出し##call-a-module-function

ゲームクライアントからモジュール関数を呼び出すには、呼び出しを認証し、サービスの機能のいずれかを呼び出す前に [Services Core SDK を初期化](/services/getting-started.md#initialize-unity-services-in-your-game-code) し、モジュール関数を呼び出す必要があります。

ゲームクライアントを使用してモジュールを呼び出す方法の詳細については、[Unity Runtime からのモジュールの実行](./run-modules/unity-runtime.md) を参照してください。

以下のステップに従って、モジュール関数を呼び出します。

1. Services Core SDK を初期化します。Cloud Code を呼び出す前に、Services Core 名前空間 (`Unity.Services.Core`) をインポートすることによりゲームコード内で Unity Services を初期化し、`InitializeAsync` メソッドを呼び出します。
2. 呼び出しの認証を行います。Cloud Code への各呼び出しは認証される必要があり、プレイヤーが Cloud Code サービスにアクセスするには有効なプレイヤー ID とアクセストークンが必要です。[認証](./authentication.md) を参照してください。`SignInAnonymouslyAsync` メソッドを呼び出して、匿名認証の使用の準備をすることをお勧めします。
3. モジュール関数を呼び出します。Cloud Code SDK を使用して、`CallEndpointModuleAsync` メソッドを使用するモジュール関数を呼び出します。

> **Note:**
>
> **ノート**: `CallEndpointModuleAsync` 関数は、Cloud Code SDK バージョン 2.3.0 以上でのみ使用可能です。

##### インテグレーションのサンプル##integration-sample

以下は、ゲームクライアント内のモジュール `ExampleModule` からモジュール関数 `SayHello` を呼び出す方法の例です。

*C#*

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

public class TestModule : 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
            string result = await CloudCodeService.Instance.CallModuleEndpointAsync("ExampleModule", "SayHello", new Dictionary<string, object> {{"name", "World"}});

            Debug.Log(result);
        }
        catch (CloudCodeException exception)
        {
            Debug.LogException(exception);
        }
    }
}
```

> **Important:**
>
> **重要**: 初めてモジュール関数を呼び出す場合、応答が開始するまで時間がかかることがあります。タイムアウトを受け取った場合は、コンソールに `Hello, World!` が出力されるまでコードを再度実行します。
