統計をさらに活用する
このチュートリアルでは、複数列の統計の作成や統計のクエリを実行する複数の方法など、サービスが提供するより高度な機能について説明します。 これらの機能により、統計サービスが実行できる限界を押し広げることを目指しています。
これらの新機能が問題解決にどのように役立つかを示す例として、競争の激しいシューティング ゲームを使用しています。 このゲームには、プレイヤーがロング ショットを打てる武器が複数あります。 ロング ショットの距離だけでなく、使用された弾丸の口径も追跡したいと考えています。
前提条件
「基本的な統計を作成する」の手順を完了します。
複数列の統計定義の作成
この例を始めるには、以前のものよりも複雑な統計定義を作成する必要があります。
ロング ショットの重要な側面 (距離と口径) をマッピングするために複数の列を定義します。 次の例は、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
の集計を使用する場合です。
統計にデータを追加する
統計が作成されたので、データを追加します。 このテーマに関する前回のチュートリアルとの主な違いは、今度は 2 つの異なる値を追加する必要があることです。 次の例は、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);
}
ここで、主なポイントは、追加される統計内の Scores
パラメーターに依存しています。 コード例では、2 つの異なる値が表示されます。これらはすべて文字列ですが、統計内の入力定義にすぎません。 これらの値は数値として処理されます。 スコアのリストの長さは、統計定義の列数と常に一致する必要があります。
統計からのデータの取得
次に、複数のエンティティに対してクエリを実行し、各エンティティに関連するすべての統計を取得する方法について説明します。 次の例は、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)}");
}
}
}
タイブレーク
複数列の統計定義がある場合は、タイブレークを必要とするシナリオに遭遇する可能性があります。 このメカニズムの動作は、列が追加された方法に従います。 新しい値が入力されるたびに、システムは最初の列の集計の条件を満たしているかどうかを確認します。 値が同じ場合は、2 番目の列の条件を確認します。 この動作は、次の列でも継続されます。
たとえば、次の 3 つの列からなる統計を作成できます。
- 最初の列には最小集計があります。
- 2 番目の列には最大集計があります。
- 3 番目の列には最終集計があります。
新しい値が入力される場合は、最初の列よりも小さい値を指定する必要があります。 次に、2 番目の列より大きい値にする必要があります。 最後に、3 番目の列が最終集計に設定されているため、最初の 2 つの検証を満たしている場合は、常に更新されます。
結論
このチュートリアルでは、次の操作を行う方法について説明しました:
- 複数列の統計を作成する
- 統計のクエリを実行する
- タイブレークのしくみを理解する。