# 他のサービスを利用した UDP の使用

> Learn how the Unity Distribution Portal worked with other services, for a service that shut down in February 2025.

| **重要**                                                                                                                                                                                                                                                                                                                                       |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Unity Distribution Portal (UDP) は、2025 年 2 月 17 日に閉鎖されます。UDP ウェブコンソールとサービスへのアクセスは、この日をもって永久に無効になります。キーストアをダウンロードする方法、およびゲームをアプリストアに直接再公開する方法については、[UDP 概要](https://api-udp.unity.com/overview) ページを参照してください。アカウントについて質問がある場合は、[Unity カスタマーサポート](https://support.unity.com/hc/en-us/requests/new?ticket_form_id=360000323692) にチケットを提出してください。 |

## UDP ビルドの GooglePlay ゲームサービス

### 概要

Android ゲームに [Google Play ゲームサービス](https://developers.google.com/games/services/console/enabling) を実装すると、実績 やリーダーボードなどの機能に Google のサービスレイヤーを活用できます。ゲームが Google Play ゲームサービスを実装している場合、[UDP](https://unity.com/products/unity-distribution-portal) がさまざまなストア用に作成するビルドをサポートするには、追加の設定が必要です。

ゲームが Google Play ゲームサービスを呼び出すと、Google Play ゲームサービスは以下の詳細が Google Play Console に登録されている情報と一致することを確認します。

* アプリケーションの **パッケージ名**
* アプリケーションが署名された **証明書**

それらが一致しない場合、プレイヤーは Google Play ゲームサービスを使用してアプリケーションにログインできません。

UDP を通して特定のストアにゲームを公開する場合、UDP はストア固有のサフィックスをパッケージ名に追加します。また、独自の秘密鍵を使用して証明書を生成しない場合、UDP は再パッケージされたビルドごとに証明書を生成します。これにより、証明書やパッケージ名が Google Play Console の情報と一致しなくなります。このため、ユーザーは Google Play ゲームサービスを使用してゲームにログインできなくなります。

次のセクションでは、この問題を解決する方法について説明します。

### UDP ビルド用に Google Play ゲームサービスを設定

このセクションでは、UDP バージョンを Google Play アプリケーションに紐づけして、Google Play ゲームサービスを UDP で機能させる方法について説明します。

1. Google Play Console で、ターゲットアプリケーションに移動します。

2. **Play Games Services** > **Setup and management** > **Configuration** の順に移動します。

   * Google Play ゲームに Google Play ゲームサービスが実装されている場合は、すでに Google Play ゲームサービスプロジェクトに紐づけられています。このケースでは、次のようにします。

     1. **Use an existing Play Games Services project** を選択します。
     2. プロジェクトを選択して **Use** を選択します。
     3. [UDP アプリケーションをゲームサービスに紐づける](#link) のステップに従います。

   * Google Play ゲームに Google Play ゲームサービスが実装されていない場合は、以下を行ってください。

     1. Play Games Services 設定ページで、**Yes, my game already uses Google APIs** か **No, my game doesn’t use Google APIs** を選択します。
     2. [Google Play ゲームサービスプロジェクトの作成と紐づけ](#create) のステップに従います。

#### Google Play ゲームサービスプロジェクトの作成と紐づけ

このセクションでは、Google Play ゲームサービスプロジェクトを作成し、それを新規または既存のクラウドプロジェクトに紐づける方法について説明します。

Play Games Services 設定ページで、**Yes, my game already uses Google APIs** を選択した場合は、以下を行ってください。

1. クラウドプロジェクトを選択します。
2. Use を選択して、新規の Play Games Services プロジェクトを作成し、既存のクラウドプロジェクトに紐づけます。

Play Games Services 設定ページで **No, my game doesn’t use Google APIs** を選択した場合は、以下を行ってください。

1. ゲーム名を入力します。
2. Create を選択して、新規の Play Games Services プロジェクトを作成し、既存のクラウドプロジェクトに紐づけます。

新規の Play Games Services プロジェクトを作成する場合、**Add credential** リンクは無効になっています。

1. **Configure OAuth consent screen** を選択します。

2. Play Games Services 設定画面で Refresh を選択します。

   Add credential オプションが有効になりました。

3. **Add credential** を選択します。

   Add credential ページが開きます。

4. Add credential ページで以下を行います。

   1. **Type** に **Android** を選択します。
   2. **Enable anti-piracy** を **Off** に設定します。これにより、ユーザーは Google Play 以外のアプリストアからゲームをインストールした場合でも、ゲームにアクセスできます。
   3. Authorization セクションで、**Create OAuth client** を選択します。選択するとポップアップ画面が表示されます。
   4. **Create OAuth Client ID** を選択し、ポップアップ画面に入力してフォームを完成します。

上記のステップを完了すると、Google Play ゲームは Google Play ゲームサービスに紐づけられます。以下のステップでは、[UDP ビルドをゲームサービスに紐づけ](#link) します。

#### UDP アプリケーションをゲームサービスに紐づける

アプリを Google Play ゲームサービスにリンクすると、他の (UDP) アプリをゲームサービスに紐づけできます。

1. Google Play Console で、**Play Games Services** > **Setup and management** > **Configuration** の順に移動します。
   1. Play Games Services 設定ページで **Add credential** を選択します。

2. Add credential ページで以下を行います。

   1. **Android** を選択します。
   2. **Enable anti-piracy** を Off に設定します。これにより、ユーザーは Google Play 以外のアプリストアからゲームをインストールした場合でも、ゲームにアクセスできます。
   3. **Authorization** セクションで、**Create OAuth client** を選択します。選択するとポップアップ画面が表示されます。
   4. **Create OAuth Client ID** を選択し、ポップアップ画面に入力してフォームを完成します。

3. Create OAuth client ID フォームで必要な項目を記入し、UDP ビルドのエントリーを作成します。

   1. **Name** フィールドで、例えば “Samsung version” のような、対応するストアに関連する名前を付けます。

   2. **Package name** フィールドで、UDP コンソールを通して対応するストアに登録されているビルドのパッケージ名を指定します。

      ストア特有のパッケージ名は UDP コンソールに表示されます。

      1. My Games > Publish タブを選択します。
      2. 対応するストアの **Advanced** を選択します。

         パッケージ名は Basic Information セクションに表示されます。

   3. Certificate フィールドには、対応する UDP ストアの証明書を使用します。Repack 操作後、UDP は新しい証明書でアプリケーションに署名します。

      ストア固有の証明書が UDP コンソールに表示されます。

      1. My Games > Publish タブを選択します。
      2. 対応するストアの **Advanced** を選択します。

         証明書が Basic Information セクションに表示されます。

         **ノート**: 以下のコマンドを使用して APK 証明書をダウンロードし、フィンガープリント情報を取得することもできます。

         `openssl x509 -in [downloaded-pem-filepath] -fingerprint -noout`
      3. SHA-1 を UDP コンソールから証明書フィールドにコピーします。

4. フォームを記入し終わったら **Create** を選択し Google Play Console に戻ります。

5. **Refresh OAuth clients** を選択します。

6. 新しい OAuth クライアントを選択します。
   1. **Save changes** を選択し、認証情報を保存します。

7. Google Play アプリケーションに紐づけるストア固有の UDP ビルドごとに、上記のステップを繰り返します。

Google Play アプリケーションにリンクした UDP ビルドは、Google Cloud Platform > Google API & Services ダッシュボードの Credentials で確認できます。

これらの手順により、Mi GetApps (この SDK は古いバージョンの Google モバイルサービスと統合しているため競合が発生します) を除き、紐づけられているすべての UDP ストアバージョンで Google Play ゲームサービスが正常に機能します。

**ノート**: Google のシステムに変更を加えると、上記のソリューションに影響を与える可能性があります。Google のトラブルシューティング情報の詳細は、[Google のドキュメント](https://www.google.com/url?q=https://developers.google.com/games/services/android/troubleshooting\&sa=D\&ust=1611571996561000\&usg=AOvVaw00u3uXWmm9qmGpqo4yuFQX) を参照してください。

## Build Automation を UDP に使用する

以下の方法で、[Build Automation](https://docs.unity.com/ugs/en-us/manual/devops/manual/unity-build-automation.md) を使用してゲームを UDP にデプロイすることができます。

* [APK を Build Automation にアップロード](#upload) し、そこから UDP にデプロイします。
* [Build Automation でゲームをビルド](#build) し、そこから UDP にデプロイします。

## Build Automation を使ってビルドを UDP コンソールにプッシュする

このセクションでは、Build Automation を使用してゲームを UDP にプッシュする方法について説明します。Unity エディターの Project Settings ウィンドウで Build Automation を有効にします。

### エディターで Build Automation を使用してゲームを UDP にデプロイする

Unity エディターの Build Automation 機能を通してゲームを UDP にデプロイするには、UDP ビルドをアップロードして UDP にプッシュする必要があります。

1. Project Settings ウィンドウの **Build Automation** タブで、これまでビルドをアップロードしたことがない場合は、**Upload Build** を選択します。

2. **FILE** で以下を行います。

   * UDP ビルドの APK を選択してください
   * 使いやすい **LABEL** を入力してください
   * **PLATFORM** フィールドを Android に設定します。

3. **UPLOAD** を選択して、アップロードプロセスを完了させます。

4. Project Settings ウィンドウの **Build Automation** タブで、ビルドの **History** タイムラインから目的のビルドを見つけ、**Push to Unity Distribution Portal** を選択します。
   1. プッシュすることを確認します。

### Unity Dashboard を使ってゲームを UDP に展開

Unity Dashboard の Build Automation 機能を通してゲームを UDP にデプロイするには、UDP ビルドを Unity Dashboard にアップロードして、そこから UDP にプッシュ送信する必要があります。

1. [Unity Developer Dashboard](https://developer.cloud.unity3d.com/build) で、プロジェクトの **Build Automation** > **History** に移動します。
2. **Upload** を選択し APK ファイルを選択します。
3. **Platform** フィールドで **Android** を選択します。
4. **Upload** を選択します。
5. ビルド横の More メニューを選択して、ドロップダウンを開きます。
6. **Push to Unity Distribution Portal** を選択します。

## Build Automation を使ったビルドとデプロイ

Unity Teams Advanced を使用する場合は、[ビルドを自動生成](https://docs.unity.com/ugs/en-us/manual/devops/manual/unity-build-automation.md#continuous-integration) できます。

Project Settings ウィンドウの Build Automation タブで、以下を行います。

1. **Manage Build Targets** > **Add new build target** の順に選択します
2. **TARGET SETUP** ウィンドウで **PLATFORM** フィールドを Android に設定し、使いやすい **TARGET LABEL** を入力します。
3. **Next: Save** を選択します。
4. **Start Build Automation** を選択してから、作成したターゲットビルドを選択します。

Unity Build Automation Developer Dashboard を通してビルドを UDP に直接プッシュします (上記参照)。

## サービスの相互運用性

UDP は、ゲームで使用されている他のサービスに、ゲームがダウンロードされたストアを通知できます。

この情報は、Unity サービスだけでなく、サードパーティまたは独自のサービスでさまざまな方法で利用できます。

例えば、[Unity Remote Config](https://unity.com/remote-config) を使用すると、ゲームのダウンロード元のストアなど、定義したルールに基づいてゲーム設定を調整できます。

このセクションでは、他のサービスがこの情報にアクセスできるようにする方法を説明し、[例](#example) を紹介します。

### どのような仕組みなのですか？

ゲームがプレイヤーのデバイスで最初に起動されると、UDP は `udp.json` ファイルを作成してゲームの Persistent Data Path に置きます。このファイルには、ゲームがダウンロードされたストアを示すフィールド `udpStore` が含まれています。その情報を取得して、目的に応じて利用します。

**注意**これにより、ゲームマニフェストに新しい権限が追加されることはありません。

### udp.json を保存場所

ファイル `udp.json` の保存場所:

`Application.PersistentDataPath + '/Unity' + /Application.CloudProjectID + /udp/udp.json`

上のパスで

* `Application.PersistentDataPath` はゲームの永続データパスです。
* `Application.CloudProjectID` はゲームの Unity プロジェクト ID です。

以下は `udp.json` ファイルへのパスの例です。

`path/storage/emulated/0/Android/data/com.mystudio.mygame/files/Unity/c83d2de2-de74-4b75-83fc-ade948bda064/udp/udp.json`

上のパスで

* `Application.PersistentDataPath`= `path/storage/emulated/0/Android/data/com.mystudio.mygame`
* `Application.CloudProjectID`= `c83d2de2-de74-4b75-83fc-ade948bda064`

### udp.json の読み込み

`udp.json` ファイルには以下の情報が含まれています。

```
{"key":"UDP","udpStore":"StoreName","udpClientId":"value_of_udpClientId","CloudProjectId":"value_of_CloudProjectId"}
```

フィールド `udpStore` には、ゲームのダウンロード元の UDP ストアの値が含まれます。

以下は `udp.json` ファイルの例です。

```
{"key":"UDP","udpStore":"Huawei","udpClientId":"icjaB7wmu_q7AOjrSLH8yw","cloudProjectId":"bc2be074-09f3-450f-8e98-a0f79c9746f7"}
```

この例では、ゲームは HUAWEI AppGallery からダウンロードされました。

**ヒント:** ファイルのコンテンツは、`JSONUtility.FromJsonOverwrite` を使ってテキストアセットとして読み込むことができます。

### udpStore 値

以下の表は、UDP で利用可能なストアの `udpStore` 値のリストです。

これらは、大文字小文字を区別します。

| ストア (UDP でのチャンネル名)             | udpStore の値 |
| ------------------------------ | ----------- |
| UDP Sandbox (ジェネリックな UDP ビルド用) | UdpSandbox  |
| ONE store                      | OneStore    |
| APPTUTTi                       | Apptutti    |
| Mi GetApps (Xiaomi)            | XiaomiStore |
| HUAWEI AppGallery              | Huawei      |
| QooApp Game Store              | QooApp      |
| Uptodown                       | Uptodown    |
| SHAREit                        | ShareIt     |
| JioGames                       | JioGames    |
| Legion Store                   | Legion      |

### Remote Config を通した udpStore の使用

[Unity Remote Config](https://unity.com/remote-config) を使用すると、アプリケーションの新しいバージョンをデプロイせずにゲーム設定を調整できます。プレイヤーがゲームを起動すると、Remote Config は、(Unity、アプリケーション、ユーザー、自身で定義したカスタム基準に基づく) ルール条件として使用されるコンテキスト属性を検出します。次に、サービスは、適用されるルールに従って、各プレイヤーのカスタマイズされた設定を返します。

ルール条件の属性として `udpStore` を使用すると、ゲームのダウンロード元の UDP ストアに応じてゲーム設定を決定できます。

Remote Config を使用して udpStore を実装するには、以下の手順に従います。

1. UDP パッケージ をダウンロードしてインストールします。
2. Unity Remote Config パッケージをダウンロードしてインストールします。[Remote Config ドキュメント](https://docs.unity3d.com/Packages/com.unity.remote-config@latest/index.html)を参照してください。
3. "udpStore" パラメーターを最低限含む AppAttributes 構造体を作ります。
   ```
   public struct AppAttributes
   {
     public string udpStore;
   }
   ```
4. ゲームコードで Remote Config の ConfigManager.FetchConfigs コールを実装します。
5. FetchConfigs を呼び出すときは、AppAttributes 構造体の新しいインスタンスを作成し、UDP ストアデータファイルを Application.PersistentDataPath + '/Unity' + /Application.CloudProjectId + /udp/udp.json から読み取ります。JSONUtility.FromJsonOverwrite を使用してファイルのコンテンツをテキストアセットとして読み取ります。
   ```
   {
       string udpFilePath = System.IO.Path.Combine(Application.persistentDataPath, "Unity", Application.cloudProjectId, "udp", "udp.json");
       string udpFileContents = System.IO.File.ReadAllText(udpFilePath);
       var appAttr = JsonUtility.FromJson&lt;AppAttributes&gt;(udpFileContents);
       Unity.RemoteConfig.ConfigManager.FetchCompleted += ConfigManager_FetchCompleted;
       Unity.RemoteConfig.ConfigManager.FetchConfigs(null, appAttr);
   }
   ```
6. AppAttributes 構造体を ConfigManager.FetchConfigs で使用するよう注意してください。
7. **Remote Config** (**Services** > **Remote Config** > **Configure**) 設定を開き、UDP ストアに基づいて変更したいパラメーターを作成します。
8. パラメーターを設定し、ゲームコードに組み込んだら、Remote Config ウィンドウで各ストアのルールを作成します。
9. 各ルールの条件に、app.udpStore == "\[storeName]" を入力します。
   * [udpStore 値](#udp-values) を参照


     **Frame:**
     ![](/api/media?file=/engine/6000.0/media/images/UDPServiceInteroperability_01.png)
10. 設定を有効にするには、Remote Config 設定の左パネルにあるルール名 の横にあるチェックボックスを選択します。
11. アプリケーションをデバイスにビルドし、ルールが正しく適用されていることを確認して、配布します。

## Unity IAP を使用した UDP 用の IAP アイテムの実装

Unity IAP を使用して UDP を実装する場合は、最初に [Unity IAP を設定](https://docs.unity3d.com/Manual/UnityIAPSettingUp.html) します。

**ノート**: ノート: UDPパッケージを使用する代わりに Unity IAP バージョン 1.22.0-1.23.5 を使って UDP を実装することを選択した場合は、Unity IAP 経由でのみ実装してください。

Unity IAP は自動的に以下を処理します。

* UDP の初期化
* ストアの IAP プロダクトインベントリのクエリ
* プロダクトの購入のリクエスト
* 購入したアイテムの消費

ただし、ゲームは [Unity IAP ドキュメント](https://docs.unity3d.com/Manual/UnityIAP.html) に基づいて、Unity IAP の同様の機能 (初期化や購入など) を適切に使用する必要があります。

Unity IAP を使用してゲームのアプリ内課金を実装したら、以下の手順で Unity IAP を使用して UDP を設定します。

### IAP インベントリのクエリ

#### Unity IAP (コードによる実装) を使用

##### エディターで定義した IAP プロダクトを取得

`queryInventory` メソッドに渡す IAP プロダクトを取得する場合は、`ProductCatalog.LoadDefaultCatalog()` を呼び出します。このメソッドは、エディターの **IAP Catalog** (**Services** > **Unity IAP** > **IAP Catalog**) で定義された IAP プロダクトを返します。

例

```
var catalog = ProductCatalog.LoadDefaultCatalog();

foreach (var product in catalog.allValidProducts)
{
   if (product.allStoreIDs.Count > 0)
   {
       var ids = new IDs();
       foreach (var storeID in product.allStoreIDs)
       {
           ids.Add(storeID.id, storeID.store);
       }
       builder.AddProduct(product.id, product.type, ids);
   }
   else
   {
       builder.AddProduct(product.id, product.type);
   }
}
```

##### UDP コンソールから IAP プロダクト情報を取得

UDP コンソールでゲームの IAP Catalog (IAP カタログ) を変更する場合は、UDP コンソールから IAP プロダクト情報を取得するようにゲームを設定してください。

`queryInventory` メソッドに渡す IAP プロダクトを取得する場合は、builder.AddProduct を呼び出し、UDP コンソールから定義された特定の IAP プロダクトを取得します。

`builder.AddProduct(product.id, product.type, new IDs{})`

各通貨に調整したプロダクト価格を表示するには、`productInfo.Value.Price` を使用します。

##### UDP コンソールから IAP カタログを取得

UDP コンソールで定義されているすべての IAP プロダクトを取得する場合は、IAP プロダクトの取得メソッドを呼び出さないでください。ゲームは自動的に UDP コンソールから IAP カタログ全体を取得します。

注意UDP コンソールに IAP プロダクトの CSV ファイルをアップロードすると、IAP カタログが完全に上書きされます。

#### Unity IAP パッケージを IAP カタログに入力

UDP 用のすべてのアプリ内課金を [IAP カタログ](/engine/6000.0/manual/unity-services/udp.md#iap-catalog) に追加して設定します。

**ノート**: ゲームクライアントで IAP カタログを使用しない場合 (例えば、ゲームサーバー上でのみ IAP アイテムを維持する場合) でも、[UDP コンソールで IAP カタログを作成](/engine/6000.0/manual/unity-services/udp/implementing-iap.md#create) する必要があります。

1. Unity エディターで **Services** > **Unity IAP** > **IAP Catalog** を選択します。
2. **Add Product** を選択し、各 IAP プロダクトに詳細情報を入力します。
   1. Unity Distribution Portal Configuration で IAP アイテムの価格を追加します。
      **Frame:**
      ![](/api/media?file=/engine/6000.0/media/images/UDPGamesWithIAP_09.png)
3. IAP プロダクトを UDP コンソールに保存するには、**Sync to UDP** を選択します。作成した各 IAP プロダクトに対し、この操作を行います。

IAP カタログが正しく保存されていることを確認するには、加えたアイテムが UDP コンソールに表示されていることを確認します。
