> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ゲームの体験版の実装

> GDK タイトル向けに Microsoft Store で利用可能な体験版オプション — パートナー センターで使用制限付き無料体験版を構成し、ゲーム内で体験版チェックを実装します。

ゲームに対して複数の種類の無料体験版を構成できます。

* *期間制限付き無料体験版* - これらの体験版は、特定の *カレンダー* 時間が経過すると期限切れになります (たとえば、使用時間に関係なく、ユーザーが体験版をダウンロードしてから 7 日後など)。
* *使用制限付き無料体験版* - ユーザーが一定の *ゲーム実行時間* の間ゲームを実行できるように構成し、その後ゲームの使用を続けるにはユーザーが購入する必要があります。
* *キュレートされた体験版* - これらの体験版には有効期限やゲーム実行時間の制限はありませんが、ゲームは何がプレイ可能かを制限できます。デモに似ていますが、ゲーム全体をダウンロードする必要があります。

<Note>
  期間ベースおよび使用ベースの体験版は、タイトルごとにユーザー 1 人につき 1 回提供されることを目的としており、他の体験版オファーと混在させてはなりません。期限切れまたは使い切った体験版のエンタイトルメントはユーザー アカウントに残り、同じゲームに対する追加の体験版オファーの取得を妨げます。顧客が体験版を取得した後は、体験版の種類を変更またはリセットできません。
</Note>

<Note>
  一部の体験版は無料ですが、特定のサブスクリプションを所有するユーザーに限定されます。
</Note>

この記事はそれらの体験版にも適用されます。

<Note>
  **Free Play Days** オファーの一部として実行されるゲームは、実際の体験版として実行されるのではなく、一時的な完全ライセンスによってのみ起動できます。
</Note>

体験版の構成と関連する構造は適用されません。

## パートナー センターで使用制限付き体験版を構成する

<Note>
  この機能は、適切な権限があり、ゲームが[制限的ライセンス](/publishing/xstore-commerce/xstore-open-restrictive-licensing)を使用している場合にのみアクセスできます。
</Note>

詳細については、Microsoft アカウント マネージャーにお問い合わせください。

ゲームのコードを変更することなく、パートナー センターで使用制限付き無料体験版を構成できます。ただし、次のシナリオではコードを追加する必要があります。

* 体験版へのアクセスを、Store で体験版を取得したユーザーのみに制限する。
* プレイ セッション間でゲームの状態を保存し、購入後に体験版から完全版ゲームにユーザーの進行状況を引き継ぐ。

1. **\[提出の概要]** ページから、**\[価格と使用可能状況]** ページに移動します。
2. **\[無料体験版]** の下でドロップダウン メニューを開き、**\[使用制限付き]** を選択します。
3. 表示される 2 つ目のドロップダウン メニューで、ユーザーがアプリを使用できる最大時間を選択します。
4. **\[保存]** を選択します。

Microsoft Store にゲームを公開すると、ゲームの製品ページで体験版情報が表示されます。

## 体験版を取得したユーザーのみにアクセスを制限する

一部の場合、体験版の所有者だけがゲームを実行できるようにしたいことがあります。この制限は使用制限付き体験版で重要です。他の誰かが別のアカウントの体験版時間を消費しないようにする必要があるためです。この機能は、[XStoreGameLicense](/reference/system/xstore/xstore_members)`.isTrialOwnedByThisUser` プロパティをチェックすることで実装できます。`false` の場合、現在のプレイヤーの続行をブロックし、独自の体験版ライセンスを取得するようユーザーに通知します。

体験版ゲームが起動されると、アクティブな体験版ライセンスを所有するユーザーがメッセージに表示されます。

<img src="https://mintcdn.com/microsoft-4404708b/iADzli99B7EWodAv/images/xstore/usagelimitedtrial.png?fit=max&auto=format&n=iADzli99B7EWodAv&q=85&s=d7ce2cbb02c139f99d5889ed54544e4d" alt="使用制限付き体験版 TCUI: 「<Gamertag>、残り x 時間未満です」" data-og-width="1920" width="1920" data-og-height="1080" height="1080" data-path="images/xstore/usagelimitedtrial.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/microsoft-4404708b/iADzli99B7EWodAv/images/xstore/usagelimitedtrial.png?w=280&fit=max&auto=format&n=iADzli99B7EWodAv&q=85&s=d11e00e9c546a270c8ab17a9981600d5 280w, https://mintcdn.com/microsoft-4404708b/iADzli99B7EWodAv/images/xstore/usagelimitedtrial.png?w=560&fit=max&auto=format&n=iADzli99B7EWodAv&q=85&s=75d1c3815a7b5eec324c2564ef839d98 560w, https://mintcdn.com/microsoft-4404708b/iADzli99B7EWodAv/images/xstore/usagelimitedtrial.png?w=840&fit=max&auto=format&n=iADzli99B7EWodAv&q=85&s=e958634047e60a3904ae7421171837d3 840w, https://mintcdn.com/microsoft-4404708b/iADzli99B7EWodAv/images/xstore/usagelimitedtrial.png?w=1100&fit=max&auto=format&n=iADzli99B7EWodAv&q=85&s=78eee31f32eee6cca22f80c9e518215f 1100w, https://mintcdn.com/microsoft-4404708b/iADzli99B7EWodAv/images/xstore/usagelimitedtrial.png?w=1650&fit=max&auto=format&n=iADzli99B7EWodAv&q=85&s=670602c28fd5ebae7c8a75806cf0e899 1650w, https://mintcdn.com/microsoft-4404708b/iADzli99B7EWodAv/images/xstore/usagelimitedtrial.png?w=2500&fit=max&auto=format&n=iADzli99B7EWodAv&q=85&s=94c27565ad1aaf55b4b661a4f260e418 2500w" />

次のコード例は、`isTrialOwnedByThisUser` をチェックする方法を示しています。

```cpp theme={null}
void CALLBACK GameLicenseTrialCheck(XAsyncBlock* asyncBlock)
{
    XStoreGameLicense result{};

    HRESULT hr = XStoreQueryGameLicenseResult(
        asyncBlock,
        &result);

    // Is this a trial?
    if (result.isActive && result.isTrial)
    {
        // Is this trial owned by this user?  
        if (!result.isTrialOwnedByThisUser)
        {
            // The user can't use another user's trial time. Show an error message.
        }
    }
}

void QueryGameLicense(XStoreContextHandle storeContextHandle, XTaskQueueHandle taskQueueHandle)
{
    auto async = new XAsyncBlock{};
     asyncBlock->queue = m_asyncQueue;
    asyncBlock->callback = GameLicenseTrialCheck;

    HRESULT hr = XStoreQueryGameLicenseAsync(
        storeContextHandle,
        async);
}
```

## 元の体験版ユーザーのためにゲーム状態を保存する

セッション間で進行状況を追跡するシングル プレイヤー キャンペーンや他のゲーム モードを持つ XBOX services 対応ゲームは、ゲーム状態を保存するために接続されたストレージを使用します。ただし、制限された体験版では、PC ユーザーが複数の Microsoft アカウントを作成し、進行状況を保存しながら (同じ XBOX アカウントを使用して) 時間制限を超えてプレイし続けることができます。このシナリオの詳細については、[PC 上での Store アカウントが一致しないシナリオの処理](/publishing/xstore-commerce/xstore-mismatched-accounts)を参照してください。

この抜け穴は、ゲームの進行状況を保存するときに [XStoreGameLicense](/reference/system/xstore/xstore_members)`.trialUniqueId` の値を保存することで防止できます。後で、ユーザーが体験版のプレイを再開したときに、`trialUniqueId` の値が最初の実行時のものと一致するかどうかを確認できます。

このコードは、ゲームがゲーム保存の一部として `trialUniqueId` を保存し、この値を返す `GetSavedTrialUniqueId` 関数を持つことを想定しています。

```cpp theme={null}
void CALLBACK GameLicenseTrialCheck(XAsyncBlock* asyncBlock)
{
    XStoreGameLicense result{};

    HRESULT hr = XStoreQueryGameLicenseResult(
        asyncBlock,
        &result);

    // Is this a trial?
    if (result.isActive && result.isTrial)
    {
        // Is this trial owned by this user?
        if (!result.isTrialOwnedByThisUser)
        {
            // The user can't use another user's trial time. Show an error message.
        }
        else
        {
            // Read the trialUniqueId that was saved with the game on the first run.
            char trialUniqueId = GetSavedTrialUniqueId();
            if (trialUniqueId != result.trialUniqueId)
            {
                // Because the IDs don't match, start the game from the beginning.
            }
        }
    }
}
```

## 開発中の体験版のテスト

体験版ライセンスでゲームをテストするには、最初にパートナー センターでゲームに体験版ライセンスが構成されている必要があります。

### XBOX

ローカル ビルドには実際のライセンスが必要です。Loose ビルドおよびパッケージ ビルドでは、MicrosoftGameConfig にコンテンツ ID と EKBID のオーバーライドを適用する必要があります。詳細については、[ライセンス テストの有効化](/publishing/xstore-commerce/xstore-licensing-setup)を参照してください。

体験版ビルドの実際の EKBID をここで使用する必要があることに注意してください。EKBID を取得するには、体験版ライセンスを持つアカウントで Microsoft Store からゲーム ビルドをダウンロードする必要があります。

<img src="https://mintcdn.com/microsoft-4404708b/hprF_XHEe0cnRr8N/images/xstore/pdptrial.webp?fit=max&auto=format&n=hprF_XHEe0cnRr8N&q=85&s=c3119c04473575c1054c89a8dc840976" alt="[無料体験版のインストール] ボタンが強調表示された体験版 PDP" width="1920" height="1080" data-path="images/xstore/pdptrial.webp" />

構成が完了したら、Store から体験版ライセンスを取得したテスト アカウントで起動すると、`XStoreGameLicense` は正確な体験版属性を示します。ビルドを起動すると、体験版通知 UI が表示されるはずです。

### PC

完全なライセンスでビルドを有効にする方法と同じで、MicrosoftGame.config で正しいアプリの ID を使用し、レジストリの場所で適切なコンテンツ ID を確認します。ビルドは、体験版であるかどうかに関係なく、Microsoft Store アプリにサインインしているアカウントのライセンスを尊重します。

## リファレンス API ドキュメント

* [XStore (API の内容)](/reference/system/xstore/xstore_members)
  * 構造体
    * [XStoreGameLicense](/reference/system/xstore/xstore_members)

## 関連項目

[コマースの概要](/publishing/xstore-commerce/xstore-commerce-overview)

[XStore 開発とテストの有効化](/publishing/xstore-commerce/xstore-product-testing-setup)

[ライセンス テストの有効化](/publishing/xstore-commerce/xstore-licensing-setup)

[XStore API リファレンス](/reference/system/xstore/xstore_members)


## Related topics

- [ライセンス供与テストの有効化](/ja-jp/publishing/xstore-commerce/xstore-licensing-setup.md)
- [GDK コマース システムの概要](/ja-jp/publishing/xstore-commerce/xstore-overview.md)
- [Partner Center 機能の概要](/ja-jp/publishing/game-publishing/concepts/overview.md)
- [XStoreGameLicense](/ja-jp/reference/system/xstore/structs/xstoregamelicense.md)
- [クロスネットワークマルチプレイヤーの実装例: MMO](/ja-jp/services/xbox-services/multiplayer/concepts/live-console-xr007-mmo-example.md)
