Tracking Player and Game Wide Global Statistics
概要
ユーザー統計データとゲーム全体のグローバル統計データの追跡を開始するには、まず、いくつかのルールと定義で構成される統計データ設定を作成する必要があります。
このドキュメントでは、統計データ設定を作成して、ユーザー統計データとゲーム全体のグローバル統計データを追跡できるようにする方法を説明します。
目標
- 統計データ設定の概要を示す。
- ユーザー統計データとグローバル統計データの統計データを設定する方法を説明する。
- AccelByte SDK を使用して、複数更新機能の利用方法を含め、統計データの使用方法を説明する。
前提条件
以下へのアクセスが必要になります。
- AccelByte 管理者ポータル
- AccelByte UnrealまたはUnity SDK
- 詳細を参照するための AccelByte 統計データAPI ドキュメント
ユーザー統計データとグローバル統計データの設定
ゲームでは、ユーザー統計データの永続的な追跡が非常に重要です。これにより、ユーザーの進行状況を一貫して追跡できます。
統計データ設定は、管理者ポータルから、次の手順に従って設定できます。
管理者ポータルで、[Game Management (ゲーム管理)]セクションに移動し、[Statistics (統計データ)]セクションを展開して、[Configurations (設定)]メニューを選択します。
[Statistic Configurations (統計データの設定)]ウィンドウで、[Add Configuration (設定を追加)]ボタンをクリックします。
[Add New Configuration (新しい設定を追加)]フォームが表示されます。
上記のフォームで次の手順を行う必要があります。
許可された形式で[Stat Code (統計データコード)]を入力します。また、後で統計データを識別しやすくするため、統計データの[Name (名前)]も入力します。任意で[Description (説明)]を入力して、作成した統計データに関する追加情報を提供することもできます。
サーバー側での追加検証用に任意で[Min.Value (最小値)]と[Max.Value (最大値)]を入力すると、許可された数値をユーザーが超えるのを確実に防げます。また、必須の[Default Value (デフォルト値)]を追加して、各ユーザーの統計データにおける最初の数値を定義する必要もあります。
また、統計データの機能を最大限に活用するための追加設定もあります。次のフォームを参照してください。
[Increment (増加)]を[true]に設定することで、統計値の減少を防げます。この機能によってサーバー側の追加検証を利用でき、ユーザーが確実に自分の利益のために特定のゲームメカニクスを活用できるようになります。
寄与しているすべてのユーザーからグローバルに集積された統計値を追跡するには、必ず[Set as Global (グローバルに設定)]を[true]に設定します。こうすることで、システムは個々のユーザーの統計データだけではなく、グローバル統計データに寄与するすべてのユーザーから集積された統計データも追跡します。
[Set By (設定方法)]フィールドを[Server (サーバー)]に設定することで、ゲームサーバーのみが統計データを更新できるようにするための検証を追加できます。これにより、ユーザーが直接ゲームクライアントから統計データを更新することはできなくなります。これは不正行為やゲームクライアントの改ざんを防ぐ方法としても優れています。
任意で統計データのタグを設定すると、ゲームから簡単に統計データをグループ化したり整理したりできます。
ゲームからの統計データの利用
管理者ポータルで統計データを設定したら、このセクションで説明されている例を参照して、ゲームから直接統計データを利用できます。
また、こちらのガイドに従って、 サーバー主導型の統計データ管理を行うこともできます。
ゲームからの統計データの更新
この更新機能は、ゲームクライアントから直接呼び出すことが可能で、シングルプレイヤーやゲームサーバーを利用しないピアツーピアのマルチプレイヤーなど、対戦型以外のジャンルに適しています。
以下の表に記載されているように、いくつかの更新戦略がサポートされています。
更新戦略 | 使用方法 | 実装例 |
OVERRIDE | この更新では、統計データの既存の値を最新の値に置き換えます。 | これは、ELO や MMR などの独自の計算がある場合に適しています。サービスが保存できるよう、最新の値を渡せます。 |
INCREMENT | この更新では、新しい値が正 (+) か負 (-) かに応じて、新しい値を既存の値に足すか、既存の値から引くかします。 | これは、バトルで得た経験値の追跡に適しています。ポイントを直接渡すことができ、サービスがその増分を処理します。 |
MAX | これは、値が既存の値よりも大きい場合にのみ統計データを更新します。 | これは、キルや与ダメージなどのベストスコアやハイスコアを追跡するのに適しています。スコアが既存のスコアよりも低い場合、サービスは更新を無視します。 |
MIN | これは、値が既存の値よりも小さい場合にのみ統計データを更新します。 | これは、レースのベストラップや最速ラウンドなどの最小スコアを追跡するのに適しています。スコアが既存のスコアよりも高い場合、サービスは更新を無視します。 |
1 人のユーザーの統計データ更新
- Unreal Engine
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString AdditionalKey = " Your additional key";
FString StatCode = " Your stat code ";
FAccelByteModelsPublicUpdateUserStatItem UserStatItem{};
UserStatItem.UpdateStrategy = EAccelByteStatisticUpdateStrategy::OVERRIDE;
UserStatItem.Value = 100.0f;
ApiClient->Statistic.UpdateUserStatItemsValue(StatCode
, AdditionalKey
, UserStatItem
, THandler<FAccelByteModelsUpdateUserStatItemValueResponse>::CreateLambda([](FAccelByteModelsUpdateUserStatItemValueResponse Result)
{
// Do something if UpdateUserStatItemsValue been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if UpdateUserStatItemsValue has an error
}));
Statistic statistic = MultiRegistry.GetApiClient().GetStatistic();
string additionalKey = " Your additional key";
string statCode = " Your stat code ";
PublicUpdateUserStatItem UserStatItem = new PublicUpdateUserStatItem {
updateStrategy = StatisticUpdateStrategy.OVERRIDE,
value = 100};
statistic.UpdateUserStatItemsValue(statCode
, additionalKey
, UserStatItem
, result =>
{
if (result.IsError)
{
// Do something if UpdateUserStatItemsValue an error
Debug.Log($"Error UpdateUserStatItemsValue, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if UpdateUserStatItemsValue been successful
}
});
1 人のユーザーに関する複数統計データの更新
- Unreal Engine
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString AdditionalKey = " Your additional key";
FAccelByteModelsUpdateUserStatItemWithStatCode UserStatItem1{};
UserStatItem.StatCode = " Your 1st stat code ";
UserStatItem.UpdateStrategy = EAccelByteStatisticUpdateStrategy::OVERRIDE;
UserStatItem.Value = 100.0f;
FAccelByteModelsUpdateUserStatItemWithStatCode UserStatItem2{};
UserStatItem.StatCode = " Your 2nd stat code ";
UserStatItem.UpdateStrategy = EAccelByteStatisticUpdateStrategy::INCREMENT;
UserStatItem.Value = 50.0f;
TArray<FAccelByteModelsUpdateUserStatItemWithStatCode> BulkUpdateUserStatItems = { UserStatItem1, UserStatItem2 };
ApiClient->Statistic.BulkUpdateUserStatItemsValue(AdditionalKey
, BulkUpdateUserStatItems
, THandler<TArray<FAccelByteModelsUpdateUserStatItemsResponse>>::CreateLambda([](TArray<FAccelByteModelsUpdateUserStatItemsResponse> Result)
{
// Do something if BulkUpdateUserStatItemsValue been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if BulkUpdateUserStatItemsValue has an error
}));
Statistic statistic = MultiRegistry.GetApiClient().GetStatistic();
string additionalKey = " Your additional key";
StatItemUpdate UserStatItem1 = new StatItemUpdate {
statCode = " Your 1st stat code ",
updateStrategy = StatisticUpdateStrategy.OVERRIDE,
value = 100};
StatItemUpdate UserStatItem2 = new StatItemUpdate {
statCode = " Your 2nd stat code ",
updateStrategy = StatisticUpdateStrategy.INCREMENT,
value = 50};
StatItemUpdate[] bulkUpdateUserStatItems = { UserStatItem1, UserStatItem2 };
statistic.UpdateUserStatItems(additionalKey
, bulkUpdateUserStatItems
, result =>
{
if (result.IsError)
{
// Do something if UpdateUserStatItems an error
Debug.Log($"Error UpdateUserStatItems, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if UpdateUserStatItems been successful
}
});
ゲームからのユーザー統計データの取得
ユーザー統計データは簡単に取得できます。ユーザー統計データはユーザープロファイルの一部として、またはゲーム UI 内の任意の場所に表示できます。また、すべてのユーザー統計データを一覧表示したり、統計データコードで一部の統計データを表示したり、管理者ポータルで以前に設定したタグごとに統計データを表示したりもできます。
SDK の機能を使用するには、次のスニペットを参照します。
現在および他のユーザー統計データの取得
- Unreal Engine
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString UserId = "Player User Id";
TArray<FString> StatCodes = { "Stat Code 1", "Stat Code 2" };
TArray<FString> Tags = { "Tag 1", "Tag 2", "Tag 3" };
int32 Offset = 0;
int32 Limit = 20;
ApiClient->Statistic.GetUserStatItems(UserId
, StatCodes
, Tags
, THandler<FAccelByteModelsUserStatItemPagingSlicedResult>::CreateLambda([](FAccelByteModelsUserStatItemPagingSlicedResult Result)
{
// Do something if GetUserStatItems has been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if GetUserStatItems has an error
})
, Offset
, Limit);
Statistic statistic = MultiRegistry.GetApiClient().GetStatistic();
string[] statCodes = { "Stat Code 1", "Stat Code 2" };
string[] tags = { "Tag 1", "Tag 2", "Tag 3" };
statistic.GetUserStatItems(statCodes
, tags
, result =>
{
if (result.IsError)
{
// Do something if GetUserStatItemshas an error
Debug.Log($"Error GetUserStatItems, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if GetUserStatItemshas been successful
}
});
ゲームからのグローバル統計データの取得
ユーザー統計データと同様に、グローバル統計データも簡単に、ゲーム UI の任意の場所に表示できます。保持しているグローバル統計データをすべて表示することや、統計データコードを使用して特定の統計データを選択することができます。
SDK の機能を使用するには、次のスニペットを参照します。
統計データコードを使用したグローバル統計データの取得
- Unreal Engine
- Unity
FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();
FString StatCode = "Your Global Statistic Code";
ApiClient->Statistic.GetGlobalStatItemsByStatCode(StatCode
, THandler<FAccelByteModelsGlobalStatItemValueResponse>::CreateLambda([](FAccelByteModelsGlobalStatItemValueResponse Result)
{
// Do something if GetGlobalStatItemsByStatCode has been successful
})
, FErrorHandler::CreateLambda([](int32 ErrorCode, FString ErrorMessage)
{
// Do something if GetGlobalStatItemsByStatCode has an error
}));
Statistic statistic = MultiRegistry.GetApiClient().GetStatistic();
string statCode = "Your Global Statistic Code";
statistic.GetGlobalStatItemsByStatCode(statCode
, result =>
{
if (result.IsError)
{
// Do something if GetGlobalStatItemsByStatCode has an error
Debug.Log($"Error GetGlobalStatItemsByStatCode, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
}
else
{
// Do something if GetGlobalStatItemsByStatCode has been successful
}
});