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

# 访问已存档的锦标赛结果

> 在手动或计划重置后访问已存档的 PlayFab 锦标赛排行榜快照，并检索先前版本的玩家排名和统计信息。

本教程说明如何访问已存档的排行榜状态。

每个排行榜都可以手动或自动重置——这意味着所有玩家的统计信息值将被移除，从而进入*清空*状态，并且排行榜版本将被更新。

不过，在这之前，PlayFab 会为每个玩家创建所有排行榜统计信息值的快照。这允许你访问排行榜的这个*已存档*版本。

<Note>
  所有标题都允许你访问排行榜最近一次存档的版本，这提供当前版本和前一个版本。例如，如果你当前的排行榜版本是 **3**，那么你只能访问版本 **3** 和已存档的版本 **2**。
</Note>

## 初始设置

在使用本指南之前，请确保你已经在标题中注册了一些玩家。以下屏幕截图显示了使用 [LoginWithCustomID](xref:titleid.playfabapi.com.client.authentication.loginwithcustomid) API 调用人工注册的 5 名玩家。

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-players-most-recent-logins.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=82e4840d634e73c5e5e9f0878f0365ab" alt="Game Manager - Players - Most recent logins" width="946" height="577" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-players-most-recent-logins.png" />

## 定义并模拟排行榜

在此步骤中，我们将为测试目的创建一个排行榜。然后，我们将通过多次填充和重置排行榜来模拟排行榜迭代过程。

打开 Game Manager：

1. 导航到 **Leaderboards** 部分。
2. 选择 **New Leaderboard** 按钮，如下所示。

配置新排行榜：

1. 将 **Statistic** 名称设置为 **TestScore**。
2. 将 **Reset Frequency** 保持为 **Manually**。
3. 保留默认的 **Aggregation** 方法。
4. 通过选择 **Save Leaderboard** 提交。

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-new-leaderboard-properties.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=2cd9b12e09ccfe716626232cb6967815" alt="Game Manager - Leaderboards - New Leaderboard - Properties" width="1280" height="900" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-new-leaderboard-properties.png" />

你将来到新的 **Leaderboards** 页面，该页面将呈现空白数据（见下文）。

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-edit-leaderboard.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=f3b2e105a30073db23eb36d8cf232e92" alt="Game Manager - Leaderboards - Edit Leaderboard" width="1920" height="910" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-edit-leaderboard.png" />

## 开始测试部分

<Info>
  以下部分是如何为本示例填充测试数据的示例。你的*真实*游戏将以更自然的方式填充这些数据。
</Info>

我们的下一步是为排行榜模拟一些数据。最快的方法是创建一个 CloudScript 处理程序，它将为给定玩家设置随机统计信息。我们将针对 All Players 分段中的每个玩家调用此处理程序。

因此，每个玩家将获得一个随机的统计信息值，这是对真实世界场景的*足够好*的近似。

让我们开始定义我们的 CloudScript（有关详细信息，请参阅代码注释）。

```javascript theme={null}
// Should be invoked from a task that runs over certain segment
handlers.PopulateLeaderboard = (args,ctx) => {
    // When handler is executed as a task over the segment
    // we can extract individual player id using the next line:
    let playerId = ctx.playerProfile.PlayerId;

    // Use player id and update player statistics as follows:
    server.UpdatePlayerStatistics({
        PlayFabId : playerId,
        Statistics : [
            {
                "StatisticName": "TestScore",
                "Value": getRandomInRange(100,1000)
            }
        ]
    });
}

// Utility method to generate random number
let getRandomInRange = (min, max) => {
    return Math.round(Math.random() * (max - min) + min);
}
```

让我们上传 CloudScript。使用 Game Manager：

1. 导航到 **Automation** 选项卡。
2. 然后导航到 **CloudScript** 子选项卡。
3. 插入 **CloudScript** 代码。
4. 选择 **Save as Revision**。
5. 最后，**Deploy Revision**。

<img src="https://mintcdn.com/microsoft-4404708b/5IpvKlT-jmAaVkeY/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-automation-cloudscript-upload-cloudscript.png?fit=max&auto=format&n=5IpvKlT-jmAaVkeY&q=85&s=7aad030809ec7893abbc42ae6f928ca0" alt="Game Manager - Automation - CloudScript - upload CloudScript" width="1292" height="707" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-automation-cloudscript-upload-cloudscript.png" />

接下来，我们需要定义一个任务，以在特定分段上执行我们的 CloudScript：

1. 导航到 **Players** 选项卡。
2. 然后，导航到 **Segments** 子选项卡。

默认情况下，**PlayFab** 会为你生成一个 **All Players** 分段。当你需要标题中注册的所有玩家（这正是我们的情况）时，此分段特别有用。

3. 选择 **All Players Segment**。
4. 最后，选择 **Run Task...**。

<Note>
  如果列表中没有 All Players 分段，请参阅我们的[玩家分段](/services/playfab/live-service-management/game-configuration/segmentation/segmentation-quickstart)快速入门以创建一个。
</Note>

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-players-segments-all-players-run-task.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=38b80b93c15928a0f22495e8a555b82d" alt="Game Manager - Players - Segments - All Players - Run Task" width="983" height="580" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-players-segments-all-players-run-task.png" />

配置任务：

1. 设置 **Name**。
2. 确保任务类型设置为 **Run actions on each Player in a Segment**。
   * 此外，请验证在 **Segment** 下选择了 **All Players**。
3. 添加一个新的 **Action**。
4. 在 **Type** 下选择 **Execute CloudScript**。
5. 然后在 **CloudScript Function** 下选择 **PopulateLeaderboard** 处理程序。
6. 最后，选择 **Save and Run** 按钮。

<img src="https://mintcdn.com/microsoft-4404708b/5IpvKlT-jmAaVkeY/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-configure-task.png?fit=max&auto=format&n=5IpvKlT-jmAaVkeY&q=85&s=b0de60452d7b3bf3d2e4198ed1b11764" alt="Game Manager - Configure Task" width="1175" height="850" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-configure-task.png" />

* 确保执行结果为 **Successful**。

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-task-execution-succeeded.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=80cba8a4162a8d74ec513be09bd71849" alt="Game Manager - Task Execution Succeeded" width="907" height="212" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-task-execution-succeeded.png" />

## 测试部分结束

### 填充测试数据

1. 再次导航到 **Leaderboards** 选项卡。
2. 选择我们的 **Leaderboard**。

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-test-score.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=5b9e840d77457f6a5d497a7b83d81d3a" alt="Game Manager - Leaderboards - Test Score" width="1272" height="668" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-test-score.png" />

1. 你将看到你的 **Leaderboard** 已填充了随机值。
2. 重置 **Leaderboard**。

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/reset-the-test-score-leaderboard.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=f91b98680e788338e37520102bb78f4f" alt="Reset the Test Score Leaderboard" width="1038" height="464" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/reset-the-test-score-leaderboard.png" />

这将为我们当前拥有的所有数据创建一个快照，然后它将*清零*每个玩家的统计信息值并递增版本。

* 一旦你的排行榜被重置，再次运行 CloudScript 任务。
* 重复此操作 2-3 次，然后重置并重新填充。

你最终将获得多个 **Leaderboard** 版本 **(1)**：

* **当前版本数据**将显示在左侧的表格中 **(3)**。
* **已存档数据**将可用于以前的版本 **(2)**。
* 只有最新的版本可用。这适用于所有标题。

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-leaderboard-versions.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=2ca281d95f15295de606458c9f450734" alt="Game Manager - Leaderboards - Leaderboard Versions" width="1204" height="694" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-leaderboard-versions.png" />

### 使用 Game Manager 访问已存档的数据

你可以直接从 **Leaderboard** 页面访问已存档的结果：

1. 导航到 **Leaderboards** 选项卡。
2. 选择你需要的 **Leaderboard**。

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-select-leaderboard.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=db629e9b5dec8a479629276004bbf22d" alt="Game Manager - Leaderboards - Select Leaderboard" width="921" height="271" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-select-leaderboard.png" />

1. 如果你的 **Leaderboard** 包含已存档的修订版本，则可以使用下面屏幕截图中显示的下载链接下载 **JSON** 数据。

<img src="https://mintcdn.com/microsoft-4404708b/IwSYTY5BEqd_x-HK/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-download-archived-revision.png?fit=max&auto=format&n=IwSYTY5BEqd_x-HK&q=85&s=4395cb8990431b53f7457010fd21fcab" alt="Game Manager - Leaderboards - Download Archived Revision" width="1204" height="694" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/game-manager-leaderboards-download-archived-revision.png" />

### 使用 API 访问已存档的数据

以下代码允许你拉取排行榜的最新（当前）版本。

```csharp theme={null}
PlayFabClientAPI.GetLeaderboard(new GetLeaderboardRequest()
{
    StatisticName = "TestScore",
}, result =>
{
    Debug.Log("Leaderboard version: "+result.Version);
    foreach (var entry in result.Leaderboard)
    {
        Debug.Log(entry.PlayFabId+" "+entry.StatValue);
    }
}, FailureCallback);
```

结果将如下面提供的示例所示。

<img src="https://mintcdn.com/microsoft-4404708b/5IpvKlT-jmAaVkeY/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/debug-output-display-leaderboard-versions.png?fit=max&auto=format&n=5IpvKlT-jmAaVkeY&q=85&s=e345a4db86df875b598d2feec2458ca3" alt="Debug output - Display Leaderboard Versions" width="267" height="225" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/debug-output-display-leaderboard-versions.png" />

或者，你可以指定要加载的排行榜版本。

```csharp theme={null}
PlayFabClientAPI.GetLeaderboard(new GetLeaderboardRequest()
{
    StatisticName = "TestScore",
    Version = 1
}, result =>
{
    Debug.Log("Leaderboard version: "+result.Version);

    foreach (var entry in result.Leaderboard)
    {
        Debug.Log(entry.PlayFabId+" "+entry.StatValue);
    }
}, FailureCallback);
```

结果将如下面提供的示例所示。

<img src="https://mintcdn.com/microsoft-4404708b/5IpvKlT-jmAaVkeY/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/debug-output-display-leaderboard-version-1.png?fit=max&auto=format&n=5IpvKlT-jmAaVkeY&q=85&s=068921c7f391fca2889ee300c6504a4d" alt="Debug output - Display Leaderboard Version 1" width="272" height="221" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/debug-output-display-leaderboard-version-1.png" />

所有标题都允许你访问排行榜的*最新*存档版本。尝试拉取更旧的版本将导致错误（见下文）。

<img src="https://mintcdn.com/microsoft-4404708b/5IpvKlT-jmAaVkeY/images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/error-leaderboard-version-not-available.png?fit=max&auto=format&n=5IpvKlT-jmAaVkeY&q=85&s=75ed581ae4e92e67969cf002bd6b0dd7" alt="Error - Leaderboard Version not available" width="371" height="48" data-path="images/playfab/community/leaderboards/tournaments-leaderboards/tutorials/error-leaderboard-version-not-available.png" />

同样的规则适用于所有的 Leaderboard 请求。

* [GetLeaderboard](xref:titleid.playfabapi.com.client.playerdatamanagement.getleaderboard)
* [GetLeaderboardAroundPlayer](xref:titleid.playfabapi.com.client.playerdatamanagement.getleaderboardaroundplayer)
* [GetFriendLeaderboardAroundPlayer](xref:titleid.playfabapi.com.client.playerdatamanagement.getfriendleaderboardaroundplayer)
* [GetFriendLeaderboard](xref:titleid.playfabapi.com.client.playerdatamanagement.getfriendleaderboard)

请参阅 [GetLeaderboardResult](xref:titleid.playfabapi.com.client.playerdatamanagement.getleaderboard#getleaderboardresult) 对象的文档，以了解你可能从排行榜数据中获得的有用属性。


## Related topics

- [使用配置文件实现高级排行榜](/zh-CN/services/playfab/community/leaderboards/tournaments-leaderboards/using-the-profile-for-advanced-leaderboards.md)
- [推送通知快速入门](/zh-CN/services/playfab/live-service-management/game-configuration/title-communications/push-notifications/quickstart.md)
- [锦标赛与排行榜](/zh-CN/services/playfab/community/leaderboards/tournaments-leaderboards/index.md)
- [XblMultiplayerTournamentsServer](/zh-CN/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayertournamentsserver.md)
- [XblTournamentReference](/zh-CN/reference/live/xsapi-c/multiplayer_c/structs/xbltournamentreference.md)
