# Game Overrides と Settings

> Configure Game Overrides and settings in Remote Config.

Unity Remote Config は、**Game Overrides** (旧称 **Campaigns**) を使用することにより、特定のユーザーグループをターゲットにして、グループごとに異なる設定を提供します。Game Overrides は **Settings** に関連付けられており、それをゲームコード内の変数にマップすることで、Game Override のオーディエンス条件が満たされた場合に、その初期値がオーバーライドされるようにします。

ゲームを設計するときや新しくデプロイする前には、Remote Config 設定を早期に計画しておきましょう。Unity では、非アクティブな Remote Config 設定を最初のデプロイに含めておくことで、自分のゲームがオーディエンスにどのように利用され、各種デバイスでどのように動作しているかを把握した時点で適用できるようにすることを推奨します。

Unity エディターで、**Window** (ウィンドウ) > **Remote Config** の順に選択して **Remote Config** ウィンドウを開き、Settings の操作を開始します。


**Frame:**
![Unity エディターでの Remote Config ウィンドウへの移動](/api/media?file=/remote-config/media/images/rc-management-window.png)

Remote Config を設定するには、**Remote Config** ウィンドウを使用します。Game Overrides は、**Open Dashboard** ボタンからアクセスできるウェブダッシュボードで設定できます。Game Overrides では、Settings を適用するのに使用する条件やプレイヤーセグメントを決めます。デフォルトでは、**Settings Config** という 1 つの設定から開始します。この設定には、[優先度が高い](#prioritizing-game-overrides) アクティブな Game Override が適用されない限りすべてのユーザーに適用される、デフォルトの Settings が含まれています。

**重要**: [環境](./configuring-your-project.md#remote-config-environments) ごとに固有の Game Overrides セットがあります。ゲームの Game Overrides を設定する前に、**Remote Config** ウィンドウで正しい Remote Config 環境を選択していることを確認してください。

Settings はキーと値のペアです。キー名をゲームコード内の変数にマップすることになるため、コードを変更することなく値を動的に変更できます。

## 新しい Settings の追加##adding-new-settings

デフォルトの **Settings Config** 設定には、特定の環境用に作成したすべての Settings が含まれます。新しい Settings を作成するには、**Settings Config** 設定を強調表示して、右側のパネルの下部にある **Add Setting** ボタンをクリックします。

**ノート**: ゲームコードで Settings を使用できる場所がエディターなので、エディター内で Settings を作成する必要があります。ただし、ゲームバイナリ内に Settings を作成した後は、Remote Config REST API や Remote Config ウェブダッシュボードを使用して更新することもできます。詳細については、[インターフェース](./_index.md#remote-config-interfaces) に関するページを参照してください。

各 Settings は、以下の **Key**、**Type**、**Value** から構成されます。

| **パラメーター** | **説明**                                                                                                                                                                                                                                                                                                     | **例**                                                                                                          |
| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| **Key**    | 以下の Game Overrides に従わなければならない Settings の名前。環境内で一意でなければならない。先頭は文字でなければならない。文字、数字、ピリオド、アンダースコア、またはハイフンのみを使用できる。255 文字以下にしなければならない。                                                                                                                                                                          | `enemyHealth``eventPackPrice``enableBetaFeature`                                                               |
| **Type**   | Settings 値の C# 変数データ型。サポート対象の型には、以下があります。`Int``Float``Bool``String``Long``Json`                                                                                                                                                                                                                            | `int``float``bool``string``long``json`                                                                         |
| **Value**  | 以下の Game Overrides に従わなければならない、この Settings の値。int 値は 32 ビットの整数 (–2147483648 から 2147483647 まで)。float 値は 32 ビットの単精度浮動小数点数。string の上限は 10,000 文字。bool は true または false 値のみを取ることができる。long 値は 64 ビットの符号付き整数 (-9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 まで)。json 値は ECMA-404 標準でサポートされている有効な json。 | `100``4.99``true``‘jack-o-lantern’``123456789012345``{"jsonKey1": {"jsonSubKey1": "on","jsonSubKey2": "off"}}` |


**Frame:**
![Settings パラメーターの例](/api/media?file=/remote-config/media/images/settings-params-with-json.png)

## 新しい Game Overrides の追加##adding-new-game-overrides

新しい Remote Config Game Override を作成するには、**Open Dashboard** ボタンを押します。そうすると、ウェブブラウザーが開き、Remote Config ページに移動するので、**View Overrides** (オーバーライドを表示) ボタン、**Create Override** (オーバーライドを作成) の順にクリックします。各 Game Override には 5 つのパラメーターがあり、詳細は以下で説明します。

* [Name](#name) (名前)
* [Targeting Strategy](#targeting-strategy) (ターゲティング戦略)
* [Condition](#condition) (条件)
* [Rollout Percentage](#rollout-percentage) (ロールアウト率)
* [Content Type](#content-type) (コンテンツタイプ)
* [Start Date and Time](#start-date-and-time) (開始日時)
* [End Date and Time](#end-date-and-time) (終了日時)

### Name##name

**Name** は Game Override の名前です。例えば、Game Override の難易度曲線なら `level_1_enemies`、季節イベントなら `halloween_event` というような名前を付けることができます。

### Targeting Strategy##targeting-strategy

**Targeting Strategy** では、Game Override のオーディエンスの種類を定義します。`Stateful` にすれば、"All Spenders" (すべての課金プレイヤー) や "Existing Players" (既存プレイヤー) などのオーディエンスを選択でき、`Stateless` にすれば、`Condition` に基づいたターゲットオーディエンスを定義できます。

### Condition##condition

**Condition** は、コンテキスト依存データ属性の JEXL 式 (以下の **JEXL のサポート** セクションを参照) であり、Game Override を適用したいオーディエンスを定義するために使用します。複数の条件を使用してこのセグメントを定義できます。Remote Config では、現時点で以下の 3 つの属性カテゴリがサポートされています。

* **user** カテゴリには、ユーザーを表す開発者定義のカスタム属性 (例えば、サブスクライバーのステータス、名前、年齢など) があり、それを [RemoteConfigService.Instance.FetchConfigs\<T, T2>(T userAttributes, T2 appAttributes)](https://docs.unity3d.com/Packages/com.unity.remote-config-runtime@latest/index.html?subfolder=/api/Unity.Services.RemoteConfig.RemoteConfigService.html#Unity_Services_RemoteConfig_RemoteConfigService_FetchConfigs__2___0___1_) に渡す必要があります。

  **ノート:** `SetCustomUserId` を使用すると、渡した ID が自動的に `user` 属性に `customUserId` としてアタッチされます。

* **app** カテゴリには、アプリケーションを表す開発者定義のカスタム属性 (例えば、接続ステータス、アプリケーションのバージョン、現在のレベルなど) があり、それを [RemoteConfigService.Instance.FetchConfigs\<T, T2>(T userAttributes, T2 appAttributes)](https://docs.unity3d.com/Packages/com.unity.remote-config-runtime@latest/index.html?subfolder=/api/Unity.Services.RemoteConfig.RemoteConfigService.html#Unity_Services_RemoteConfig_RemoteConfigService_FetchConfigs__2___0___1_) に渡す必要があります。

* **unity** カテゴリには、以下の表で詳しく説明する事前定義済みの属性があります。

| **属性**                       | **説明**                                                                                                                                                                   | **例**                                                              |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------ |
| `unity.appBuildVersion`      | アプリケーションが実行されているビルド番号 (これをエディターで設定するには、**Edit** (編集) > **Project Settings** (プロジェクト設定) > **Player** (プレイヤー) の順に移動します)。                                                   | `unity.appBuildVersion == '1'`                                     |
| `unity.appVersion`           | アプリケーションが実行されているバージョン (これをエディターで設定するには、**Edit** (編集) > **Project Settings** (プロジェクト設定) > **Player** (プレイヤー) の順に移動します)。                                                   | `unity.appVersion == '1.0'`                                        |
| `unity.cpu`                  | CPU プロセッサーの名前。                                                                                                                                                           | `unity.cpu == 'Intel(R) Core(TM) i7-7920 HQ CPU @ 3.10GHz'`        |
| `unity.cpuFrequency`         | アプリケーションを実行しているデバイスのプロセッサー周波数 (MHz)。                                                                                                                                     | `unity.cpuFrequency >= 3100`                                       |
| `unity.country`              | 該当する国。この属性には、[ISO 3166-1 alpha2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) 国コードが使用されます。カスタム属性の定義に関する情報については、[コードの統合](./code-integration.md) に関するドキュメントを参照してください。 | `unity.country == 'US'`                                            |
| `unity.language`             | 該当する言語。この属性には、[ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) 言語コードが使用されます。カスタム属性の定義に関する情報については、[コードの統合](./code-integration.md) に関するドキュメントを参照してください。  | `unity.language == 'en'`                                           |
| `unity.osVersion`            | アプリケーションを実行しているデバイスの OS バージョン。                                                                                                                                           | `unity.osVersion == 'Mac OS X 10.14.4'`                            |
| `unity.platform`             | 該当するデバイスまたはプラットフォーム。以下の値が有効です。`Android``iOS``Linux``macOS``PS4``PS5``Switch``WebGL``Wii``Windows``XboxOne``XboxSeriesS``XboxSeriesX`                                     | `unity.platform == 'iOS'`                                          |
| `unity.timeSinceStart`       | アプリケーションのセッションが開始してから経過した時間 (ミリ秒)。                                                                                                                                       | `unity.timeSinceStart >= 60000`                                    |
| `unity.graphicsDeviceVendor` | ユーザーのグラフィックスカードのベンダー。                                                                                                                                                    | `unity.graphicsDeviceVendor == 'ATI Technologies Inc.'`            |
| `unity.ram`                  | デバイス上の RAM メモリの容量 (MB)。                                                                                                                                                  | `unity.ram >= 16384`                                               |
| `unity.model`                | デバイスのモデル。                                                                                                                                                                | `unity.model == "LGE Nexus 5"` または `unity.model.contains("Nexus")` |

**ノート**: 一覧表の `unity` 属性は変更される可能性があります。最新の全属性リストについては、[REST API のドキュメント](https://services.docs.unity.com/remote-config-admin/v1/#tag/Game-Overrides) を参照してください。

例えば、スコアが 10 を上回るユーザーをターゲットとする Game Override を定義する場合は、ドット表記法を使用して `app` コンテキストの `score` プロパティを定義できます。

```text
app.score >= 10
```

また、同じ Game Override 内で複数の属性を参照することもできます。

```text
user.score >= 10 && app.level == 5
```

すべての条件に一致し、常に適用される Game Override を定義するには、単純に `true` を入力します。

#### JEXL のサポート##jexl-support

Remote Config では、[Java Expression Language (JEXL) 仕様](http://commons.apache.org/proper/commons-jexl/reference/syntax.html) がサポートされていますが、以下のような例外が一部あります。

* Remote Config では式のみがサポートされます。
* Remote Config ではスクリプトはサポートされません。
* Remote Config では現時点で関数も条件式もサポートされません。
* Remote Config では `&&` および `||` ステートメントを使用した複数の条件がサポートされますが、JEXL 文字列は 500 文字以下に制限されます。

**ノート**: 属性のネスト (例えば、`app.level1.score`) は行えません。無効な JEXL 文字列を使用したり、**Condition** フィールドを空のままにしたりすると、エラーが発生します。

### Rollout Percentage##rollout-percentage

Rollout Percentage では、この Game Override に従うユーザーベースの割合を決めます。値が 100 未満の場合は、Unity が Game Override をその割合のプレイヤーにユーザー ID ベースでランダムに割り当てます。プレイヤーごとに体験が異なる可能性はありますが、各プレイヤーの体験はプレイセッション全体にわたって一貫したものになります。このパラメーターは、分析データと組み合わせて結果を解析する場合に特に役立ちます。

### Content Type##content-type

利用するサービスによっては、Remote Config によって使用される `Config Overrides`、Economy サービスによって使用される `Currency` や `Inventor Item` など、特定の Game Override 用に選択できるさまざまなコンテンツタイプがあります。

### Start Date and Time##start-date-and-time

Game Override がいつ有効になるかを決める開始日時を、任意で指定できます。タイムスタンプは [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) UTC 形式 (`YYYY-MM-DDThh:mm:ssZ`) の文字列で表されます。値を指定しない場合、Game Override は [アクティブ化](#enabling-and-disabling-game-overrides) の時点ですぐに有効になります。

### End Date and Time##end-date-and-time

Game Override がいつアクティブでなくなるかを決める終了日時を、任意で指定できます。タイムスタンプは [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) UTC 形式 (`YYYY-MM-DDThh:mm:ssZ`) の文字列で表されます。値を指定しない場合、Game Override は [非アクティブ化](#enabling-and-disabling-game-overrides) されるまで有効な状態を維持します。

## Game Override への Settings の適用##applying-settings-to-a-game-override

Settings を Game Override に適用するには、目的の Game Override に移動して **Content** (コンテンツ) ブロックを **編集** し、使用できるすべての Settings のリストを表示します。

## Game Overrides の有効化と無効化##enabling-and-disabling-game-overrides

Game Override のページ上部にあるボタンを使用すると、有効または無効にできます。

## エディターウィンドウでの Settings の編集##editing-settings-in-the-editor-window

エディターの Remote Config ウィンドウで Settings のキーと値を編集する場合は、必ず変更を保存して **プッシュ** してください。そうするまでは、設定がローカルにしか格納されません。Remote Config 環境を切り替える前に、必ず変更をプッシュして保存してください。

Settings を削除するには、削除する各要素の横にある **ゴミ箱** ボタンをクリックします。なお、アクティブな Game Override が現在 Settings を使用している場合、その Settings は削除できません。

## Game Overrides の優先順位付け##prioritizing-game-overrides

Game Override ごとに、重み付きの優先度値 `Low`、`Medium` または `High` を割り当てることができます。優先度を数値で割り当てる場合は、Advanced Editor を介してその機能を使用し、`1` (最高の優先度) から `1000` (最低の優先度) までの範囲内で割り当てることができます。それには、Game Override で **Edit Schedule** > **Scheduling** フィールドの順にクリックし、**Use Advanced Editor** を選択して整数値を入力します。

* 新しい Game Overrides と **Settings Config** 設定はデフォルトで `medium` に設定されます。
* 競合が生じた場合は、先に作成された Game Override が優先されます。

## Game Overrides と Settings の更新##updating-game-overrides-and-settings

Game Override を編集して変更を保存するには、以下の手順に従ってください。

1. Game Override を [無効](#enabling-and-disabling-game-overrides) にします。
2. エディターウィンドウまたはウェブ UI で目的のキー値フィールドを編集します。
3. **Push** (プッシュ) ボタンをクリックして変更をリモートサービスに保存します。
4. **Pull** (プル) ボタンをクリックして最新のリモート設定をサービスから取得します。
   1. 更新が適用されていることを確認します。
5. Game Override を [有効](#enabling-and-disabling-game-overrides) にします。
   1. もう一度プルし、Game Override が適切に更新されてアクティブになっていることを確認します。

**ノート**: リモートの変更をローカル設定にプルすると、サービスから取得した設定で上書きされてローカル設定が削除されます。

## JSON 設定値##json-setting-value

JSON 型の設定を使用している場合は、**Remote Config** ウィンドウに **JSON Editor** ダイアログが表示されます。これによって JSON 値のフォーマットと検証を行うことができます。このウィンドウを開くには、JSON 設定の **Edit** ボタンを押します。


**Frame:**
![JsonValidFormatted](/api/media?file=/remote-config/media/images/json-valid-formatted.png)

有効ではあるもののフォーマットされていない JSON 値を入力すると、検証インジケーターが緑色になります。JSON オブジェクトを再フォーマットするには、**Format** ボタンを使用します。


**Frame:**
![JsonUnformatted](/api/media?file=/remote-config/media/images/json-unformatted.png)

JSON 値が無効な場合は、検証インジケーターが赤色になり、JSON オブジェクトを送信できません。


**Frame:**
![JsonInvalid](/api/media?file=/remote-config/media/images/json-invalid.png)

**Select json object** フィールドで JSON ファイルをロードできます (`/Assets` フォルダーから使用できる場合)。ファイルを選択するには、フィールドの右にあるボタンをクリックします。


**Frame:**
![OpenJsonFromFile](/api/media?file=/remote-config/media/images/open-json-from-file.png)

## 更新とクライアントセッション##updates-and-client-sessions

設定への変更を反映させるために新しいバージョンのアプリケーションをデプロイする必要はありません。プレイヤーがアプリケーションの新しいセッションを開始するたびに、クライアントデバイスから Remote Config 設定の更新がリクエストされます。Remote Config では、ユーザーがアプリケーションを起動するか、アプリケーションがバックグラウンドに移行してから 30 分以上経過した後に再度開くと、新しいセッションになります。

クライアントがインターネットに接続されていないか、Remote Config サービスと通信できない場合、アプリケーションでは受信してキャッシュしておいた最新の設定が使用されます。

**ノート**: Remote Config サービスへの設定のリクエストは非同期プロセスであり、最初のシーンのロードが終わる前に完了しないことや、極端な場合、まったく完了しないこともあります。そのため、必ず妥当なデフォルト設定でゲームの変数を初期化してください。

## コードの統合##code-integration

Game Overrides と Settings を設定したら、ゲームコードに [Remote Config を統合](./code-integration.md) します。
