> ## 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.

# シーズナル リーダーボード

> VersionConfiguration を使用して PlayFab のシーズナル リーダーボードを構成し、月次またはカスタムの周期でランキングをリセットし、以前のトーナメント バージョンをクエリします。

このチュートリアルでは、リーダーボードのバージョン管理の概念について説明します。特定のリーダーボードの複数のバージョンを持ちたいケースは複数あります。たとえば、月次のトーナメント モードがあるゲームでは、リーダーボードの構造は同じままですが、特に競争性の高いゲームではプレイヤーが変わる可能性が高いです。

[基本的なリーダーボードを作成する](/services/playfab/community/leaderboards/create-basic-leaderboard)の例を引き続き使用します。ここでは、アーケード ゲームが非常に人気になったと想像してください。そこで、「Top of the Mountain」という新しいモードが導入されます。毎月、任意のプレイヤーが参加できるトーナメントを開催します。上位 100 人に入ったプレイヤーは、メイン メニューの特別なリーダーボードに表示され、誰がゲームで一番なのかを皆が確認できるようになります。

## バージョン管理のためのリーダーボード定義を作成する

前の例では、リーダーボード定義を作成する際に、バージョン管理における `VersionConfiguration` パラメーターの重要性について触れました。ここでは、その使い方と仕組みを詳しく説明します。

```C# theme={null}
public static async Task CreateLeaderboardDefinitionAsync(PlayFabAuthenticationContext context, string leaderboardName)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    CreateLeaderboardDefinitionRequest leaderboardDefinitionRequest = new CreateLeaderboardDefinitionRequest()
    {
        AuthenticationContext = context,
        Name = leaderboardName,
        SizeLimit = 1000,
        EntityType = "title_player_account",
        VersionConfiguration = new VersionConfiguration()
        {
            MaxQueryableVersions = 12,
            ResetInterval = ResetInterval.Month,
        },
        Columns = new List<LeaderboardColumn>()
        {
            new LeaderboardColumn()
            {
                Name = "arcadeScoreTournament",
                SortDirection = LeaderboardSortDirection.Descending,
            }          
        }
    };

    PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createLbDefinitionResult = await leaderboardsAPI.CreateLeaderboardDefinitionAsync(leaderboardDefinitionRequest);
}
```

この例が基本的なリーダーボードと異なる主なポイントは、`VersionConfiguration` パラメーターです。このパラメーターにより、同じリーダーボードのバージョンをいくつクエリできるかを指定する `MaxQueryableVersions` 設定を定義できます。この例では 12 バージョンをクエリできるように設定しており、直近 12 個のリーダーボードをクエリできるようにします。`ResetInterval` パラメーターは、リセット プロセスの頻度を定義します。この処理では、以前と同じ構成で空のリーダーボードが作成され、version パラメーターは N = N + 1 のように変更されます (リーダーボード定義の作成時は N = 0)。

たとえば、version パラメーターが 2 で、リーダーボードに 100 個のエントリがあるとします。ここでこのリーダーボードのバージョンをインクリメントすると、その結果、version パラメーターが 3 の空のリーダーボードが新しく作成されます。一方で、以前のリーダーボードはクエリ可能な状態でシステムに残ります。

`ResetInterval` はさまざまな方法で機能します。この例では月次ですが、開発者のニーズに応じて変更できます。この場合、リーダーボードは構成された時点から毎月自動的にリセットされることを意味します。次のリセット戦略をサポートしています:

* Day
* Hour
* Manual
* Month
* Week

すべての利用可能な構成の詳細については、こちらの API ドキュメントを参照してください:
[API リファレンス - リーダーボードの作成](https://learn.microsoft.com/en-us/rest/api/playfab/progression/leaderboards/create-leaderboard-definition)

## リーダーボードのバージョンをインクリメントする

この新しい構成により、トーナメント モードのために同じリーダーボードの複数のバージョンを持てるようになりました。しかし、問題が発生したためにリーダーボードを手動でリセットしてトーナメントを最初からやり直したい場合はどうでしょうか。そのような場合には、API を使って手動でリセットを行うことができます。SDK を使用した例を次に示します:

```C# theme={null}

public static async Task ResetLeaderboards(PlayFabAuthenticationContext context, string leaderboardName)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    IncrementLeaderboardVersionRequest resetLeaderboardRequest = new IncrementLeaderboardVersionRequest()
    {
        AuthenticationContext = context,
        Name = leaderboardName,
    };

    PlayFabResult<PlayFab.LeaderboardsModels.IncrementLeaderboardVersionResponse> resetLeaderboardResponse = await leaderboardsAPI.IncrementLeaderboardVersionAsync(resetLeaderboardRequest);
}

```

## 過去のバージョンをクエリする

リーダーボードの過去のバージョンをクエリする必要がある場合は、すべての GetLeaderboards API で利用可能な `version` パラメーターを使用できます。SDK を使用した例を次に示します:

```C# theme={null}
public static async Task<List<EntityLeaderboardEntry>> GetLeaderboard(PlayFabAuthenticationContext context, string leaderboardName)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    GetEntityLeaderboardRequest getLbRequest = new GetEntityLeaderboardRequest()
    {
        LeaderboardName = leaderboardName,
        StartingPosition = 1,
        PageSize = 20,
        AuthenticationContext = context,
        Version = 1
    };

    PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetLeaderboardAsync(getLbRequest);
    
    return lbResponse.Result.Rankings;
}
```

これで、リーダーボードのバージョン管理に関するあらゆる課題に対処する準備が整いました。ここで重要な点は、バージョンとして保持することを決めたリーダーボード定義の数は、サービス内のストレージを使用するためメーターに計上されるということです。詳細については次を参照してください:

* [リーダーボードの書き込み](/services/playfab/pricing/meters/leaderboard-meters)

## まとめ

このチュートリアルでは、次の操作の方法を学びました:

* 適切なリセット戦略を持つリーダーボードの作成。
* リーダーボードのバージョンのインクリメント。
* リーダーボードの過去のバージョンのクエリ。

## 関連項目

* [リーダーボードでさらにできること](/services/playfab/community/leaderboards/doing-more-with-leaderboards)
* [基本的なリーダーボードを作成する](/services/playfab/community/leaderboards/create-basic-leaderboard)
* [統計によってプレイヤーをランキング付けする](/services/playfab/community/leaderboards/leaderboards-linked-to-stats)
* [グループ リーダーボード](/services/playfab/community/leaderboards/group-leaderboards)
* [手動ティア](/services/playfab/community/leaderboards/manual-tiers)
* [制限](/services/playfab/community/leaderboards/limits-leaderboards)
* [クォータ](/services/playfab/community/leaderboards/quota-leaderboards)
* [リーダーボードにコンテキスト データを追加する](/services/playfab/community/leaderboards/metadata-leaderboards)
* [API リファレンス](/services/playfab/community/leaderboards/api-reference)
* [リーダーボードと Cloudscript](/services/playfab/community/leaderboards/leaderboards-cloudscript)
* [Playstream を使用したリーダーボード](/services/playfab/community/leaderboards/leaderboards-with-playstream-and-telemetry)


## Related topics

- [API リーダーボード リファレンス](/ja-jp/services/playfab/community/leaderboards/api-reference.md)
- [グループ リーダーボード](/ja-jp/services/playfab/community/leaderboards/group-leaderboards.md)
- [リーダーボードの制限](/ja-jp/services/playfab/community/leaderboards/limits-leaderboards.md)
- [リーダーボードのクォータ](/ja-jp/services/playfab/community/leaderboards/quota-leaderboards.md)
- [Azure Functions を使用したリーダーボード](/ja-jp/services/playfab/community/leaderboards/leaderboards-cloudscript.md)
