# Unity エディターとのインテグレーション

> Author and modify Cloud Code scripts directly within the Unity Editor using the Cloud Code Authoring module.

Cloud Code オーサリングモジュール (Cloud Code パッケージとともにインストールされる) を使用すると、任意で、スクリプトのオーサリングと変更を Unity エディター内で直接的に行うことができます。その後、[Deployment パッケージ](https://docs.unity3d.com/Packages/com.unity.services.deployment@latest) を使用して、Unity エディターから Unity Dashboard にスクリプトをアップロードできます。

> **Note:**
>
> Unity エディターでのスクリプトのオーサリングは、Unity 2021.3 以上でのみサポートされます。

Unity エディターに存在するスクリプトを使用すると、ユーザーは (クラウド内のバージョンの代わりに) ソース管理を信頼できる唯一の情報源として扱うことができ、ロールバック、二等分、その他の一般的な操作のアクションが簡略化されます。例えば、Cloud Code オーサリングモジュールは、クライアントの C# スクリプトと Cloud Code スクリプトの同期を保つなどのタスクを容易にします。

## 前提条件##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 にアクセスすることもできます。

### 必要なパッケージをインストールする##install-required-packages

エディター内で Cloud Code スクリプトを作成するには、以下のパッケージをインストールする必要があります。

* Deployment
* Cloud Code (2.1.1 以降)

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

これらのパッケージをインストールして、使用可能なパッケージのリストに追加するには、以下を行います。

1. Unity エディターの Package Manager (パッケージマネージャー) ウィンドウで、**+ (add)** (+ (追加)) > **Add package by name…** (名前でパッケージを追加...) を選択します。
2. `com.unity.services.deployment` を入力します。
3. **Add** (追加) を選択します。
4. これらのステップを `com.unity.services.cloudcode` について繰り返します。

## Unity エディター内でのオーサリング##authoring-within-unity-editor

Cloud Code オーサリングモジュールを使用すると、直接 Unity エディター内で、Cloud Code スクリプトの作成、編集、デプロイを行うことができます。

### スクリプトの作成##create-a-script

以下のステップに従い、Cloud Code オーサリングモジュールを使用して Cloud Code スクリプトを作成します。

1. Unity エディターで、Project (プロジェクト) ウィンドウを右クリックし、**Create** (作成) > **Services** (サービス) > **Cloud Code Js Script** (Cloud Code Js スクリプト) を選択します。
2. C# スクリプトの場合と同様に、スクリプトに名前を付けます。Cloud Code スクリプトでは、サービスをアップロードするときに、それらのファイル名を識別子として使用します。
3. **Enter** を押します。

> **Note:**
>
> Cloud Code は、使用できる識別子名を制限します。ファイルが正しくアップロードされたことを確認するには、[スクリプトの作成](./unity-dashboard.md#create-a-script) を参照してください。

新しいスクリプトが Project ウィンドウに表示されます。また、Deployment (デプロイ) ウィンドウでは、**Window** (ウィンドウ) > **Deployment** (デプロイ) を選択してアクセスできます。

### スクリプトの編集##edit-a-script

既存の Cloud Code オーサリングスクリプトを編集する方法は 2 つあります。

* Project (プロジェクト) タブで、既存のスクリプトをダブルクリックします。
* Deployment (デプロイ) ウィンドウで、既存のスクリプトを探し、右クリックメニューから **Open** (開く) を選択します。

デフォルトでは、Cloud Code スクリプトはデフォルトの JavaScript エディターに開きます。

デフォルトの JavaScript エディターを設定するには、以下を行います。

1. Unity エディターで、**Edit** (編集) > **Preferences...** (環境設定...) > **Cloud Code** を選択します。
2. Javascript Editor (Javascript エディター) セクションで、優先する JS エディターのアプリケーションパスを選択します。
3. **Apply** (適用) を選択します。

上級者向けケースでは、以下の引数を指定できます。

* `$(File)`: アセットのファイルパス
* `$(ProjectPath)`: プロジェクトディレクトリ
* `$(SolutionPath)`: ソリューションパス
* `$(EditorExePath)`: エディターの実行ファイルパス (Unity エディター内で **Edit** (編集) > **Preferences…** (環境設定...) > **External Tools** (外部ツール) を選択することで選択します)

以下は、いくつかの可能な設定例を表します。

* JetBrains Rider (Windows 上):

  * アプリケーション: `cmd.exe`
  * 引数: `/C "$(EditorExePath) $(ProjectPath) $(File)"`

* Microsoft Visual Studio Code:

  * アプリケーション: `Code.exe`
  * 引数: `$(ProjectPath) $(File)"`

### スクリプトのデプロイ##deploy-a-script

スクリプトは Deployment (デプロイ) ウィンドウからデプロイできます。詳細については、[Deployment パッケージのマニュアル](https://docs.unity3d.com/Packages/com.unity.services.deployment@latest) を確認してください。

## スクリプトパラメーターの変更##modify-script-parameters

Unity エディターで Cloud Code スクリプトパラメーターにアクセスして変更できます。

### エディターの Inspector ウィンドウでパラメーターにアクセス##access-parameters-in-the-editors-inspector-window

Unity エディターの Project ウィンドウでスクリプトを選択することにより、Cloud Code スクリプトのパラメーターを変更できます。スクリプトのパラメーターがエディターの Inspector ウィンドウに開きます。

> **Important:**
>
> スクリプトのパラメーターを変更すると、既存のゲームクライアントが非互換になる可能性があります。クライアントは、非互換のパラメーターを送信したり、必須のパラメーターを送信しなかったりする可能性があります。

可能なパラメーター型は以下のとおりです。

* String
* Boolean
* Numeric
* JSON
* Any (任意)

> **Note:**
>
> [Inspector](https://docs.unity3d.com/Manual/UsingTheInspector.html) では、パラメーターの編集のサポートに制限があり、UGS CLI はこれらのパラメーターを読み取ることができません。エディターと CLI の両方を使用する場合は、[スクリプト内でパラメーター](#declare-parameters-in-the-script-body) を使用します。

### スクリプト本文でのパラメーターの宣言##declare-parameters-in-the-script-body

Cloud Code スクリプトでのシームレスな体験のために、各パラメーター名をキーとして、その型を値として含む `params` オブジェクトをエクスポートすることで、パラメーターをスクリプト内で直接宣言できます。

> **Warning:**
>
> **重要**: パラメーターを設定する前に `module.exports` プロパティを割り当てる必要があります。

> **Warning:**
>
> **重要**: インラインスクリプトパラメーターを有効にするには、Cloud Code JS 開発環境を NodeJS で設定する必要があります。詳細については、[JavaScript プロジェクトオーサリングガイド](https://docs.unity3d.com/Packages/com.unity.services.cloudcode@latest/index.html?subfolder=/manual/Authoring/javascript_project.html) を参照してください。

> **Warning:**
>
> **重要**: スクリプト内パラメーターは、現在 Unity Dashboard でサポートされていません。

例を次に示します。

*JavaScript*

```js
module.exports.params = { "echo" : "Boolean" }
```

または、パラメーターが必須であることを指定したい場合は、`type` と `required` の両方のプロパティを含むオブジェクトを指定できます。

*JavaScript*

```js
module.exports = async ({ params, context, logger }) => {
    return {
        "value": params["aParam"]
    };
};

module.exports.params = { "aParam" : { "type": "String", "required": true } }
```

デフォルトでは、パラメーターは必須ではありません。

どちらの形式も希望に応じて組み合わせることができます。

*JavaScript*

```js
module.exports = async ({ params, context, logger }) => {
    var value = params["echo"] ? params["aParam"] : "default";
    return {
        "value": value
    };
};

module.exports.params = {
  "echo" : "Boolean",
  "aParam" : { "type": "String", "required": true }
 }
```

スクリプトパラメーターを使用している場合、それらは以前に定義した Inspector パラメーターをオーバーライドします。

スクリプト内パラメーターは、パラメーターを宣言するためのよりシンプルな代替方法を提供しますが、Deployment パッケージを使用せずに更新しようとした場合、Unity Dashboard は現在スクリプト内パラメーターを解析しません。

## JS バンドル##js-bundles

> **Note:**
>
> JS バンドルは、com.unity.services.cloudcode\@2.3.0 以上で使用可能であり、UGS コマンドラインインターフェースではまだサポートされていません。

JS スクリプトは、`import` または `require` キーワードを使用してローカルスクリプトまたは外部モジュールをインポートできます。バンドルプロセスでは、スクリプトを入力として使用し、バンドル結果を Unity Dashboard にフィードします。このプロセスは、ローカルファイルを変更しません。

スクリプトでバンドルを有効にするには、`bundling` オブジェクトをエクスポートし、値を true に設定します。このプロセスはスクリプトごとです。デフォルトでは、スクリプトはバンドルされません。バンドルを有効にした場合、スクリプトは [Deployment ウィンドウ](#deployment-window) を介したデプロイの前にバンドルされます。

> **Important:**
>
> バンドルオプションを設定する前に、module.exports プロパティを割り当てる必要があります。

*JavaScript*

```js
module.exports.bundling = true;
```

以下の例は、サンプルプロジェクトでバンドルがどのようになるかを示しています。

*lib.js*

```js
module.exports.helloWorld = "Hello world!";

```

*scriptToBundle.js*

```js
const lib = require("./lib");

module.exports = async ({ params, context, logger }) => {
    return {
        "value": lib.helloWorld
    };
};

module.exports.bundling = true;
```

## Deployment (デプロイ) ウィンドウ##deployment-window

Deployment (デプロイ) ウィンドウは、Deployment パッケージのコア機能です。これを使用すると、すべてのサービスが、デプロイニーズに合う 1 つのまとまったインターフェースを持つことができ、クラウドアセットをそれぞれのクラウドサービスにアップロードできます。

詳細については、[Deployment パッケージのマニュアル](https://docs.unity3d.com/Packages/com.unity.services.deployment@latest) を確認してください。

## Unity エディター内の Cloud Code JavaScript プロジェクト##cloud-code-javascript-projects-in-the-unity-editor

Unity エディター内の Cloud Code JavaScript プロジェクトは、Unity プロジェクトのルートに配置され、以下の構造を持ちます。

├── `Assets`\
│ └── `CloudCode`\
│ └── `cloud_script.js`\
├── `node_modules`\
├── `package.json`\
└── `package-lock.json`

`package.json` には、プロジェクト設定が格納されます。このファイルは JavaScript (JS) エディターと NPM によって使用され、C# が .csproj ファイルタイプを使用して Unity エディターの情報を定義する方法と同様に動作します。JavaScript プロジェクト内で使用されるこれらの `package.json` ファイルは Unity パッケージではなく、NPM パッケージです。これは、Unity と NodeJS が同じパッケージ管理システムを使用していることとは偶然の一致です。

`package-lock.json` は NPM によって生成され、依存関係解決のために使用されます。このファイルをソース管理して、依存関係が常に同じ方法で解決されるようにすることをお勧めします。

### NodeJS##nodejs

開発者用の他のツールをサポートするには、開発者は [NodeJS](https://nodejs.org/en/) をインストールする必要があります。NodeJS では、オートコンプリートおよび開発環境に期待されるその他の機能をサポートできます。

### オートコンプリート##autocomplete

JS のオートコンプリートの大半は、[型定義](https://github.com/typings/registry) プロジェクトによって処理されます。`.d.ts` ファイルを使用して、型定義された API を定義することで、JavaScript ファイルを強化できます。ほとんどのパブリック JS ライブラリには、独自の `.d.ts` ファイルが含まれるか、型定義内で定義されたものがあります。

エディターで依存関係のオートコンプリートを有効にするには、依存関係の型定義を特定できる必要があります。これは、`node_modules` を参照することで行います。オートコンプリートを有効にするには、`package.json` ファイルを使用して適切なファイルを `node_modules` にインストールします。

### 外部ツール##external-tools

JS プロジェクト内から適切な `npm install ...` コマンドを実行して、外部ツールを追加できます。次に、公式なツールガイドラインに従って、これらのツールを設定できます。

ESLint と Jest の以下の例を考えてみましょう。

#### ESLint##eslint

1. `npm i -D eslint` を実行します。このコマンドは、ESLint をプロジェクトの依存関係に追加します。

2. プロジェクトのルートに、以下を含む `.eslint.json` ファイルを作成します:\\

   *JSON*

   ```js
   {
       "env": {
       "commonjs": true,
       "es2021": true
       },
       "extends": "eslint:recommended",
       "parserOptions": {
       "ecmaVersion": 13
       },
       "rules": {
       }
   }
   ```

3. ESLint を実行するように IDE を設定します。これは、Visual Studio Code では自動的に行われますが、IDE によっては追加の設定が必要になることがあります。

4. ESLint が設定され、動作しています。

ESLint が動作していることをテストするには、有効だが `eslint:recommended` ルールセットに違反しているコードを追加します。例えば、`if (something == -0)` では IDE に ESLint 警告が表示されます。

#### Jest##jest

Jest は、JavaScript テスト用のフレームワークです。以下は、Cloud Code スクリプトの単体テストを作成する方法の例です。

1. `npm install --save-dev jest` を実行します。このコマンドにより、Jest パッケージがインストールされます。

2. `.es10` スクリプトで実行するように Jest を設定します。

3. 以下のコードスニペットを `package.json` に追加します:\\

   *JSON*

   ```js
   "jest": {
       "moduleFileExtensions": ["es10", "js"],
       "testMatch": ["**/*.test.es10"]
   }
   ```

`moduleFileExtensions` エントリーにより `js` および `es10` ファイルがテストに対して有効になり、`testMatch` エントリーにより `.test.es10` で終わるファイルがテストファイルとして有効になります。

#### 単体テストの例##unit-testing-example

以下の JS 単体テストの例は、オブジェクトを返してから、テストスクリプトの結果が同じかどうかを確認します。より高度なオプションはモッキングで使用可能です。

##### **テストするスクリプト**:##the-script-to-be-tested

Cloud Code は以下のシグネチャを期待します。

*JavaScript*

```js
module.exports = async ({ params, context, logger }) => {
    return {value: "1"};
};
```

##### **テストスクリプト**:##the-test-script

*JavaScript*

```js
const test = require("./jest_01.es10")
it("test",async () =>{
    expect(await test({})).toMatchObject({value:"1"});
});
```

##### テストの実行##running-your-tests

コマンドラインで、以下のコマンドを使用してテストを実行します: `npm run test`。
