使用统计信息执行更多作

在本教程中,我们将介绍该服务必须提供的更多高级功能,例如创建多列统计信息和多种查询统计信息的方法。 借助这些功能,我们的目标是限制统计信息服务应该能够执行的作。

我们将使用竞争激烈的射击游戏作为这些新功能如何帮助我们解决某些问题的示例。 在此游戏中,有多个武器,允许玩家击中长射。 我们不仅要跟踪远射的距离,还要跟踪所用子弹的口径。

先决条件

完成 创建基本统计信息中的步骤。

创建多列统计信息定义

若要从此示例开始,我们需要创建一个比之前更复杂的统计定义。

我们将定义多个列来映射长镜头的关键方面:距离和口径。 以下示例演示如何使用 C# SDK 创建统计信息定义。

public static async Task CreateStatisticDefinitionAsync(PlayFabAuthenticationContext context, string statName)
{
    PlayFabProgressionInstanceAPI statsAPI = new PlayFabProgressionInstanceAPI(context);
    CreateStatisticDefinitionRequest statDefinitionRequest = new CreateStatisticDefinitionRequest()
    {
        Name = statName,
        AuthenticationContext = context,
        EntityType = "title_player_account",
        VersionConfiguration = new VersionConfiguration()
        {
            MaxQueryableVersions = 1,
            ResetInterval = ResetInterval.Manual,
        },
        Columns = new List<StatisticColumn>()
        {
            new StatisticColumn()
            {
                Name = "Distance",
                AggregationMethod = StatisticAggregationMethod.Max,
            },
             new StatisticColumn()
            {
                Name = "Caliber",
                AggregationMethod = StatisticAggregationMethod.Min,
            }
        },
    };
    
    PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createStatDefResult = await statsAPI.CreateStatisticDefinitionAsync(statDefinitionRequest);
}

此处最重要的组件是 Columns 参数,它允许 的 StatisticColumn 多个定义,以便统计信息可以有多个值。 唯一的例外是使用 的 Sum聚合。

将数据添加到统计信息

创建统计信息后,接下来添加数据。 与之前关于此主题的教程main区别在于,现在我们需要添加两个不同的值。 以下示例演示如何使用 C# SDK 将数据添加到统计信息。

public static async Task UpdateStatisticForPlayer(PlayFabAuthenticationContext context, string statName, string entityId, int score)
{
    PlayFabProgressionInstanceAPI statsAPI = new PlayFabProgressionInstanceAPI(context);
    UpdateStatisticsRequest updateStatRequest = new UpdateStatisticsRequest()
    {
        Entity = new PlayFab.LeaderboardsModels.EntityKey()
        {
            Id = entityId,
            Type = EntityType
        },
        AuthenticationContext = context,
        Statistics = new List<PlayFab.LeaderboardsModels.StatisticUpdate>() 
        {
            new PlayFab.LeaderboardsModels.StatisticUpdate() 
            {
                Name = statName,
                Scores = new List<string> { score.ToString(), score.ToString()},
            }
        }
    };

    PlayFabResult<UpdateStatisticsResponse> updateResult = await statsAPI.UpdateStatisticsAsync(updateStatRequest);
}

此处,main点依赖于Scores要添加的统计信息中的 参数。 在代码示例中,我们看到了两个不同的值,它们都是字符串,但它只是统计信息中的输入定义。 这些值作为数字处理。 分数列表的长度应始终与统计定义的列数匹配。

从统计信息检索数据

现在,我们将学习一种查询多个实体并获取与每个实体相关的所有统计信息的方法。 以下示例演示如何使用 C# SDK 将数据添加到统计信息。

public static async Task GetStatsForEntities(PlayFabAuthenticationContext context, string[] entityIds)
{
    PlayFabProgressionInstanceAPI statsAPI = new PlayFabProgressionInstanceAPI(context);

    GetStatisticsForEntitiesRequest request = new GetStatisticsForEntitiesRequest()
    {
        AuthenticationContext = context,
        Entities = entityIds.Select(entity => new PlayFab.LeaderboardsModels.EntityKey()
        {
            Id = entity,
            Type = EntityType
        }).ToList(),
    };

    PlayFabResult<GetStatisticsForEntitiesResponse> result = await statsAPI.GetStatisticsForEntitiesAsync(request);

    foreach (EntityStatistics entityStatistics in result.Result.EntitiesStatistics)
    {
        Console.WriteLine("Stats for entity: " + entityStatistics.EntityKey.ToString());
        foreach (var stat in entityStatistics.Statistics)
        {
            Console.WriteLine($"{stat.Name} : {string.Join('|', stat.Scores)}");
        }
    }

}

断线

当我们具有多列统计定义时,我们会遇到需要中断的场景。 此机制的工作方式遵循添加列的方式。 每当出现新值时,系统会检查它是否符合第一列的聚合条件。 如果值相同,则转到 并检查第二个列明的条件。 对于以下列,此行为将继续存在。

例如,我们可以有一个三列的统计信息:

  • 第一列具有最小聚合。
  • 第二列具有最大聚合。
  • 第三列具有“上次聚合”。

如果传入新值,则需要小于第一列。 然后,它需要大于第二列。 最后,第三列设置为“上次聚合”,因此,如果它满足前两个验证,则始终更新。

总结

在本教程中,我们学习了如何执行以下作:

  • 创建多列统计信息
  • 查询统计信息
  • 了解断线的工作原理。

另请参阅